我有一个rails模型,它有一系列属性(列),我不想为每个select请求加载。所以我需要做的就是让它如果试图访问一个属性(通过getter方法),那么它将执行一个select语句来从数据库中获取所有列。
我的问题是,当我从数据库中获取列时,是否有一种方法可以将这些属性值应用于activerecord值,而不必使for循环应用每个属性值?
答案 0 :(得分:4)
以这种方式尝试:
def Person < ActiveRecord::Base
def method_missing(method_id, *args, &block)
begin
super
rescue
reload
super
end
end
end
然后最初加载这样的记录(例如):
person = Person.select(:id).find(20)
当你做的时候
person.name
然后它应该命中method_missing并在失败时重新加载记录(带有所有属性)。
答案 1 :(得分:0)
https://github.com/jorgemanrubia/lazy_columns以方便的gem形式提供了非常相似的功能。它使您可以指定要延迟加载的某些列。