我们的Rails 3应用程序有型号为Person
和Message
。消息可以是特定于个人的(当消息person_id
列已设置)或者它们可以是“全局”(当person_id
列为NULL时)。Rails“has_many”与NULL外键的关联
我们希望有使用简单has_many
关系:conditions
option这样:
class Person < ActiveRecord::Base
has_many :messages,
:conditions => proc { ['(messages.person_id IS NULL) OR ' +
'(messages.person_id = ?)'], self.id }
# ...
end
但现在看来,该has_many
类方法执行后编码“条件”选项为逻辑“与”条款与Person对象的ID相等的外键约束(例如“FROM messages WHERE person_id=123 AND (person_id IS NULL OR person_id=123)
”)。看起来没有办法允许具有空外键的关联对象属于这种关联。
Rails 3/ActiveRecord提供了一种方法来做到这一点,或者我必须破解我自己的关联方法吗?
不幸的是,这意味着你不能这样做:Person.limit(2).includes(:all_messages),因为all_messages不是关联。 –
@JoeVanDyk是的,你说得对。但是,包含(:all_messages)会执行额外的SQL查询来执行急切加载。因此,除了语法外,根据我的建议,在性能方面没有实际差异。 –
执行包含(:all_messages)会导致最多一个额外的查询。如果你确实Person.limit(100).includes(:all_messages),这会导致两个查询。如果您使用上面的#all_messages,那将会是101个查询来加载所有内容。 –