次の where ステートメントがあります。
<% location = Location.where('locname' == client.locname) %>
見つかったロケーション レコードの .id を取得するにはどうすればよいですか?
これはうまくいきませんでした:
<% location = Location.where('locname' == client.locname).id %>
助けてくれてありがとう!
次の where ステートメントがあります。
<% location = Location.where('locname' == client.locname) %>
見つかったロケーション レコードの .id を取得するにはどうすればよいですか?
これはうまくいきませんでした:
<% location = Location.where('locname' == client.locname).id %>
助けてくれてありがとう!
あなたが提供した最初のコード サンプルで 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 を実行する必要があるまで SQL を実行せずに、スコープを連鎖させることができます。これが、上記のルイスの答えが機能する理由です。ActiveRecord::Relation で #first を呼び出すと、クエリが強制的に実行されます。
設計上の指針として、コントローラーで @location として場所を割り当ててから、ビューでインスタンス変数を使用する必要があります。
次のように ActiveRecord が提供する find メソッドを使用することもできます。
<% location = Location.find(:first, :conditions => ["locname = ?", client.locname]).id %>
また、SQL インジェクションの可能性をすべて排除するために、クエリを適切にパラメータ化する必要があることにも注意してください。