0

我有两个模型,在 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 中做同样的事情。

4

1 回答 1

0

@family_members.people.first_name不应该工作所以我很惊讶你发现它工作...... @family_members 包含一个 Family 对象,@family_members.people 是一个 Person 对象数组。

你调用它的事实@family_members似乎让我觉得你期望它是一个 Persons 数组......在这种情况下,正确的代码将是......

@family_members = Family.find(1).people # finds people in first Family object

如果您希望 @family_members 仅包含第一个家庭成员,那么...

@family_members = Family.find(1).people.first

如果您想要所有家庭成员的名字数组,那么...

@family_members = Family.find(1).people # finds people in 1st Family object
@family_members.map {|member| member.first_name} # array of first_name

@family_members = Family.find(1)并且@family_members = Family.where(:id => 1)在功能上是相同的.. 两者都检索数据库中的第一个家庭对象,在每种情况下都可能包含零个、一个或多个人。

为了清楚起见,上面所有示例中的“1”指的是检索到的 Family 对象,而不是 Family 中的哪个人。

于 2013-07-15T03:55:07.400 回答