0

次の where ステートメントがあります。

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

見つかったロケーション レコードの .id を取得するにはどうすればよいですか?

これはうまくいきませんでした:

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

助けてくれてありがとう!

4

3 に答える 3

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 を実行する必要があるまで SQL を実行せずに、スコープを連鎖させることができます。これが、上記のルイスの答えが機能する理由です。ActiveRecord::Relation で #first を呼び出すと、クエリが強制的に実行されます。

設計上の指針として、コントローラーで @location として場所を割り当ててから、ビューでインスタンス変数を使用する必要があります。

于 2013-05-03T15:25:05.757 に答える
0

次のように ActiveRecord が提供する find メソッドを使用することもできます。

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

また、SQL インジェクションの可能性をすべて排除するために、クエリを適切にパラメータ化する必要があることにも注意してください。

于 2013-05-03T15:16:51.513 に答える