我有两个模型,在 people 表中创建了适当的外键:
class Person < ActiveRecord::Base
belongs_to :family
class Family < ActiveRecord::Base
has_many :people
如果我执行以下操作,我会得到一个对象 - @family_members - 作为实例变量,我没有问题:
@family_members = Family.find(1)
我可以在我的视图中轻松访问“子”人员表字段:
@family_members.people.first_name
但是,如果我将 arel 方式与“where”等一起使用,我会得到一个“ActiveRecord::Relation”,而不是一个普通的对象,这让我很难理解如何像我一样从 people 表中访问相同的“first_name”字段上面访问:
@family_members = Family.where(:id => 1)
or even
@family_members = Family.joins(:people).where(:id => 1)
(甚至需要“加入”吗??)我知道使用“.first”会导致查询运行:
@family_members = Family.where(:id => 1).first
但它返回一个数组,而不是一个对象,所以如果我在我的视图中使用:
@family_members.people.first_name
我收到“方法‘人’未知”错误。
如何像使用“find”创建的对象但使用 ActiveRecord 关系一样访问 people 表的“first_name”字段?
* 添加信息 7/15 * ** * ** * *
为了澄清我在寻找什么——如果我写的是 SQL 而不是 Arel,我会写以下内容:
SELECT f.home_phone, f.address, p.first_name, p.last_name, p.birthday
FROM families f INNER JOIN people p ON p.family.id = f.id WHERE family_id = 1
将该查询的结果加载到结果集中后,我可以访问:
myResultSet("home_phone") -- the home_phone from the families table
myResultSet("address") -- the address from the families table
myResultSet("first_name") -- the first_name from the people table
myResultSet("birthdate") -- the birthdate from the people table
如果查询中的两个表具有同名字段,我将只使用“AS”以另一个名称请求其中一个字段。我在 web 应用程序中使用这种查询/结果集多年,我试图推断如何在 Rails 和 ActiveRecord 中做同样的事情。