2008-10-14 25 views
56

Tôi đang tạo một loạt các lần di chuyển, một số trong đó là di chuyển "tạo bảng" hoặc "sửa đổi bảng" chuẩn và một số sửa đổi dữ liệu. Tôi đang sử dụng mô hình ActiveRecord thực tế của tôi để sửa đổi dữ liệu, a la:Làm cách nào để bắt buộc ActiveRecord tải lại lớp học?

Blog.all.each do |blog| 
    update_some_blog_attributes_to_match_new_schema 
end 

Vấn đề là nếu tôi tải các lớp Blog, sau đó sửa đổi bảng, sau đó sử dụng lớp Blog một lần nữa, các mô hình có định nghĩa bảng cũ và không thể lưu vào bảng mới. Có cách nào để tải lại các lớp và định nghĩa thuộc tính của chúng để tôi có thể tái sử dụng chúng không?

Trả lời

124

Câu trả lời là có!

Blog.reset_column_information 
+2

Xem ra các mô hình có mối quan hệ. Nếu 'class Blog; thuộc về Chủ sở hữu; cuối cùng, sau đó bạn có thể cần 'Owner.reset_column_information' ngoài Blog. –

+3

Đặt lại tất cả các cột! 'ActiveRecord :: Base.descendants.each {| c | c.reset_column_information} ' – zm1th

+0

Ném 'Rails.application.eager_load!' trước bất kỳ cuộc gọi nào đến con cháu để khắc phục sự cố với các mô hình không được tự động tải – elju

2

Tạo trường hợp mới:


Old_blogs = Blog.all 

# thay đổi/sửa đổi bảng db ở đây thay đổi thông tin

New_blogs = Blog.all # this should be reloaded or you could use the .reload on this 

#, tải cũ vào mới

ví dụ:

Old_blogs.each do |blog| 
    New_blogs.find(blog.id).title = blog.title 
end 
4

tôi luôn luôn sử dụng mô hình mới trong cuộc di cư

MyBlog < ActiveRecord::Base 
     set_table_name 'blogs' 
    end 

    def self.up 
     MyBlog.all.each do |blog| 
     update_some_blog_attributes_to_match_new_schema 
     end 
    end 

Nhưng Blog.reset_column_information là thuận tiện hơn.

Các vấn đề liên quan