我有这个架构:
“人”模型:
class Person < ActiveRecord::Base
has_one :info
has_many :friends
end
“信息”模型:
class Info < ActiveRecord::Base
belongs_to :person
attr_accessible :description
end
“朋友”模特:
class Friend < ActiveRecord::Base
belongs_to :person
attr_accessible :friend_id
end
假设我们有两个人:person1和person2。每个都在“info”表中记录其描述。让我们假设person2是person1的朋友。
“人”表的内容:
id:1
id:2
“信息”表的内容:
id:1,person_id:1,描述:“这是人1,我们的主要人物。”
id:2,person_id:2,说明:“这是第2个人,我们的第二个家伙。”
“朋友”表的内容:
id:1,person_id:1,friend_id:2
如果我想得到person1的朋友,我会这样做:
Person.first.friends
这会给我:
id:1,person_id:1,friend_id:2
现在,如何为每行添加“info”内容?
答案 0 :(得分:1)
这是我带来的第一个解决方案:
Friends.select("p.description").joins("INNER JOIN info i ON i.person_id = friend_id").where(person_id: 1)
任何有更好/更清晰/更有效率的人?
答案 1 :(得分:1)
您是否尝试过使用内置“包含”查询关联功能的Rails?
来自http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
应该是Person.first.friends.includes(:info)
更新:啊,你想要朋友信息,模特上没有任何关联可以立即获得。
看起来您缺少一个关联来获取朋友的Person
模型(而不是用户)。类似的东西:
class Friend < ActiveRecord::Base
belongs_to :person
belongs_to :friendly_person, :class_name => "Person", :foreign_key => "friend_id"
end
然后,您可以使用与Person.first.friends.includes(:friendly_person => :info)
之前类似的包含设置的关联,并且应该返回朋友的信息。
另一个更新:要访问friendly_person
的信息列,您可以使用该关联。与friendly_person.info.description
中一样。你不能在一个集合上这么做(显然)你必须拥有一个人的实例。像Person.first.friends.includes(:friendly_person => :info).first.friendly_person.info.description
这样的东西......但我想指出这种类型的代码不被认为是一种好的做法。