7

当我在 Rails 3.2 控制台中时,我可以做到这一点:

p = Person.last
p.last_name

它打印姓氏。

但是当我尝试通过 找到它时id,它能够找到单个记录并将其存储在我的变量p中,但我无法打印该last_name 列。例如:

p = Person.where(id: 34).limit(1)

在此处打印p显示所有列,但p.last_name这样说

NoMethodError: undefined method `last_name' for
#<ActiveRecord::Relation:0x000000055f8840>

任何帮助,将不胜感激。

4

4 回答 4

14

一个where查询将返回一个ActiveRecord::Relation,它的行为类似于一个数组,即使您限制了返回记录的数量。

如果您改为将查询更改为:

p = Person.where(id: 34).first

它将按您的意愿工作,并且 arel 知道自动将查询限制为单个结果,因此您不必显式指定limit(1).

您也可以更改为

p = Person.find(34) # Throws an ActiveRecord::RecordNotFound exception if Person with id 34 does not exist

或者

p = Person.find_by_id(34) # Returns nil if Person with id 34 does not exist. Does *not* throw an exception.

它将按预期返回一条记录。

编辑:where 查询返回 ActiveRecord::Relation,因为注释中提到的@mu 太短

于 2012-05-19T01:38:17.833 回答
4

这将返回活动记录对象的集合:

p = Person.where(id: 34).limit(1)

但是只有一个 id = 34,所以它是 1 的集合。

这样做的方法是:

p = Person.where(id: 34).limit(1).first

或更好:

p = Person.where(id: 34).first

或者,甚至更好:

p = Person.find(34)
于 2012-05-19T02:25:41.283 回答
1

你可能真正在寻找的是

@person = Person.find(34)
@person.last_name
于 2012-05-19T02:16:28.487 回答
0

在您的情况下, Person 是一个类,它是从 ApplicationRecord 继承的

p = Person.where(id:10).limit(1)

它只返回查询的结果而不是对象。

您可以使用

p.class # => It reurns Nilclass which means its not at all a class 

所以你不能在 p 上使用 p.last_name 或 p.first_name。

于 2017-06-15T08:18:56.320 回答