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.

期待どおりに単一のレコードが返されます。

編集:コメントで言及されている@mu が短すぎるため、WHEREクエリは ActiveRecord::Relation を返します。

于 2012-05-19T01:38:17.833 に答える
4

これは、アクティブなレコード オブジェクトのコレクションを返します。

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

しかし、id=34 は 1 つしかないので、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 に答える