Rails Model.where如何获取ID?

时间:2013-05-03 14:37:43

标签: ruby-on-rails

我有以下where声明:

      <% location = Location.where('locname' == client.locname) %>

如何获取找到的位置记录的.id?

这不起作用:

      <% location = Location.where('locname' == client.locname).id %>

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

<% location = Location.where("locname = ?", client.locname).first.id %>

原因是where将返回ActiveRecord::Relation,因此您可以循环浏览元素,也可以像上面一样抓住第一个元素。

答案 1 :(得分:0)

您也可以使用ActiveRecord提供的find方法,如:

<% location = Location.find(:first, :conditions => ["locname = ?", client.locname]).id %>

还要注意,您需要正确地对查询进行参数化,以消除SQL注入的所有可能性。

答案 2 :(得分:0)

您提供的第一个代码示例不允许您获取ID的原因是它不是Location类的实例。使用我自己项目中的一些代码:

1.9.2p290 :001 > ch = Character.where(name: 'Catharz')
Character Load (2.9ms)  SELECT "characters".* FROM "characters" WHERE "characters"."name" = 'Catharz'
=> [#<Character id: 2, name: "Catharz", player_id: 2, archetype_id: 4, created_at: "2012-03-29 07:10:31", updated_at: "2012-11-26 05:36:11", char_type: "m", instances_count: 348, raids_count: 148, armour_rate: 5.1, jewellery_rate: 5.29, weapon_rate: 5.48>]

1.9.2p290 :002 > ch.class
 => ActiveRecord::Relation

这是因为返回模仿你的类的ActiveRecord:Relation类的实例。你可以通过在返回值上调用#klass来看到这一点。

1.9.2p290 :002 > ch.klass
=> Character(id: integer, name: string, player_id: integer, archetype_id: integer, created_at: datetime, updated_at: datetime, char_type: string, instances_count: integer, raids_count: integer, armour_rate: float, jewellery_rate: float, weapon_rate: float)

但是如果你尝试获得一个id,你将得到以下异常:

1.9.2p290 :004 > ch.id
NoMethodError: undefined method `id' for #<ActiveRecord::Relation:0xce58344>

ActiveRecord :: Relation类允许您将范围链接在一起,而不需要执行SQL,直到您需要执行它。这就是为什么路易斯上面的回答会起作用的原因。在ActiveRecord :: Relation上调用#first将强制执行查询。

作为设计指针,您可能应该在控制器中将您的位置指定为@location,然后在视图中使用实例变量。