如何访问已加入的ActiveRecord对象的属性?

时间:2015-04-27 01:44:18

标签: ruby-on-rails

这是一个措辞严厉的标题,但我想不出更明确的一个,道歉。

我有一个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,但这似乎会进行额外的数据库查询,这似乎不太理想。

2 个答案:

答案 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