渴望加载has_many关联(Rails)

时间:2015-10-09 19:10:03

标签: ruby-on-rails ruby-on-rails-3.2 eager-loading

假设我有Conversation has_many Messages

class Conversation < ActiveRecord::Base
  has_many :messages, dependent: :destroy

  def messages_for(u)
    messages.map do |msg|
      if msg.user == u
        msg if msg.attr1.nil?
      else
        msg if msg.attr2.nil?
      end
    end
  end
end

和messages.rb:

class Message < ActiveRecord::Base
  belongs_to :conversation
end

正如您所知,messages_for远远不是最佳表现。在我每次迭代消息时收到查询的那一刻,急切加载相关消息的最佳方法是什么。

请注意我正在使用Rails 3.2.22,我尝试使用类似self.includes(:messages)joint(:messages)的内容,但目前还没有运气。

假设我不想直接使用查询,我确实希望迭代这些对象。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

用户也是一个模型,你在这个方法中生成N + 1,因为对于每条消息,你拉动用户如此渴望加载它就是你能做到的最好。

self.includes(messages: :users).messages.map |msg|
  // rest of the code
end