web-dev-qa-db-ja.com

ActiveRecordは、選択した列のみを検索して返します

編集2

これに出くわした場合、私はこれにpluckを使用するので、両方の答えを確認してください


私はかなり大きなカスタムデータセットを持っているので、jsonとしてエコーアウトするために戻りたいです。 1つの部分は次のとおりです。

l=Location.find(row.id)
tmp[row.id]=l

しかし、私は次のようなことをしたいです:

l=Location.find(row.id).select("name, website, city")
tmp[row.id]=l

しかし、これは機能していないようです。これをどのように機能させるのですか?

どうも

編集1
別の方法として、含める属性のみの配列を渡す方法はありますか?

83
timpone

Rails 2

l = Location.find(:id => id, :select => "name, website, city", :limit => 1)

...または...

l = Location.find_by_sql(:conditions => ["SELECT name, website, city FROM locations WHERE id = ? LIMIT 1", id])

このリファレンスドキュメント は、.findで使用できるオプションのリスト全体を提供します。これには、番号、ID、またはその他の任意の列/制約による制限方法が含まれます。

Rails 3 w/ActiveRecord Query Interfaceで

l = Location.where(["id = ?", id]).select("name, website, city").first

参照: アクティブレコードクエリインターフェイス

これらのチェーンされた呼び出しの順序を入れ替えて、.select(...).where(...).firstを実行することもできます。これらの呼び出しはすべて、SQLクエリを作成して送信します。

81
jefflunt

pluck(column_name)

このメソッドは、直接SQLクエリとして単一の列による選択を実行するように設計されています。指定された列名の値を持つ配列を返します。値は列と同じデータ型を持ちます。

例:

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck を参照してください

3.2以降でRailsが導入され、単一の列のみを受け入れます。 Rails 4では、複数の列を受け入れます

201
prasad.surase

私はかなり新しい開発者なので、私の答えはかなり遅れています。これはあなたができることです:

Location.select(:name, :website, :city).find(row.id)

ところで、これはRails 4

14
tkhuynh