Rails 3.2:在after_initialize中使用预先加载的关系

时间:2012-11-29 21:17:32

标签: ruby-on-rails relation

我想对关系做一些操作,如果它已经热切(例如通过includes)。在具体的术语中,我有一个数据结构Thread,其中包含n Message个。我想在他们急切加载时创建一个消息树。我尝试了如下:

class Thread
  has_many :messages

  after_initialize do
    gen_tree if messages.loaded?
  end
end

我的问题是钩子是在加载关系之前执行的。与after_find相同。

有没有办法达到我想要的目的?

问候,  CK

1 个答案:

答案 0 :(得分:0)

我找到的一个解决方案是重命名现有的关系方法并实现自己的方法:

class Thread
  has_many :messages

  alias_method :messages_orig, :messages
  def messages
    ret = messages_orig

    unless @generated
      @generated = true
      gen_tree
      sort_tree
    end

    ret
  end
end

据我测试,它没有负面的副作用。

LG,  CK