加入两个表时如何从第三个表中获取信息?

时间:2012-04-02 16:45:44

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有这个架构:

enter image description here

  • 有一张桌子供人使用。
  • 每个人都有一个“信息”表。
  • 人可以有朋友。这存储在另一个名为“friends”的表中,该表具有该人的外键,另一个表示他的朋友(两者都指向“person”表)。

“人”模型:

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”内容?

2 个答案:

答案 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这样的东西......但我想指出这种类型的代码不被认为是一种好的做法。