has_many 关联 (Rails) 的预加载
Eager loading for has_many associations (Rails)
假设我有 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)
之类的东西,但到目前为止没有成功。
假设我不想直接使用查询,我确实想遍历对象。
如有任何帮助,我们将不胜感激。
用户也是一个模型,您在这种方法中生成 N+1,因为对于每条消息,您都会拉动用户如此急切地加载它,这是您能做的最好的事情。
self.includes(messages: :users).messages.map |msg|
// rest of the code
end
假设我有 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)
之类的东西,但到目前为止没有成功。
假设我不想直接使用查询,我确实想遍历对象。
如有任何帮助,我们将不胜感激。
用户也是一个模型,您在这种方法中生成 N+1,因为对于每条消息,您都会拉动用户如此急切地加载它,这是您能做的最好的事情。
self.includes(messages: :users).messages.map |msg|
// rest of the code
end