我有以下where声明:
<% location = Location.where('locname' == client.locname) %>
如何获取找到的位置记录的.id?
这不起作用:
<% location = Location.where('locname' == client.locname).id %>
感谢您的帮助!
答案 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,然后在视图中使用实例变量。