需要时Rails lazyload属性

时间:2011-07-09 18:05:07

标签: ruby-on-rails ruby-on-rails-3 activerecord orm attributes

我有一个rails模型,它有一系列属性(列),我不想为每个select请求加载。所以我需要做的就是让它如果试图访问一个属性(通过getter方法),那么它将执行一个select语句来从数据库中获取所有列。

我的问题是,当我从数据库中获取列时,是否有一种方法可以将这些属性值应用于activerecord值,而不必使for循环应用每个属性值?

2 个答案:

答案 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形式提供了非常相似的功能。它使您可以指定要延迟加载的某些列。