这是一个措辞严厉的标题,但我想不出更明确的一个,道歉。
我有一个Owner
模型,具有name
属性。所有者has_many :books
和预订belongs_to :owner
。我试图列出所有书籍及其所有者。直观的方法是@books = Book.all
。
但每个图书实例只有owner_id
,我想获得该所有者的名称。
在SQL中我会做
SELECT books.title, books.author, owners.name
FROM books
JOIN owners on owner.id = books.owner_id;
但我不确定如何使用ActiveRecord在一个查询中获取所有这些数据,Google并没有帮助我。有人能指出我在文档中的正确位置或以其他方式给我一个提示吗?
我知道您可以在每个图书实例上执行owner.name
,但这似乎会进行额外的数据库查询,这似乎不太理想。
答案 0 :(得分:0)
您应该了解协会的运作方式。当然,在db-record上,本书只有owner_id,但belongs-to
关联允许您直接引用所有者记录 - 包括其所有属性,例如:
book.owner.name
这是Rails guide on associations - 您应该阅读它...而且可能所有其他的导轨也是如此。你将学到很多东西,它会让你的生活变得如此简单:)
答案 1 :(得分:0)
您可以使用includes
预加载关联。这将在同一查询中加载关联数据。
@books = Book.includes(:owner).all
旁注:
调用book.owner.name
会对book
owner.name
施加依赖,这违反了Law of Demeter。请考虑使用delegate来实现book.owner_name
。