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


88

編集2

これに出くわしたら、両方の答えをチェックしてください。


かなり大きなカスタムデータセットがあり、jsonとしてエコーされて戻ってきます。一部は次のとおりです。

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

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

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

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

どうも


別の方法で編集1、私が含めたい属性のみの配列を渡すことができる方法はありますか?

回答:


85

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のActiveRecordクエリインターフェース

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

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

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


しかし、すべてではなく単一のインスタンスだけが欲しい
timpone '27 / 10/27

回答を編集しました。:limitこれを行う、あるいはすべき:firstか、:lastあなたが望むものに応じて、または何でも。私がリンクした参照ドキュメントは、そのすべてを行う方法を説明します。
jefflunt、2011年

Rails 3で同等のクエリを実行する方法を含むように更新されました
jefflunt 2012年

204

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以降であり、単一の列のみを受け入れます。レール4では、複数の列を受け入れます


1
わかりました。複数の列を使用するのは素晴らしいです。この答えでそれを学びました。Rails 3は、受け入れられた答えを必要とします。
ジェイシェパード

受け入れられた答えは、その当時、pluckが利用できなかった正しい原因です。
prasad.surase 2014年

User.pluck(:email、:id) SELECT "users"。 "email"、 "users"。 "id" FROM "users"
pranav prashant 2015

2
Model.uniqがModel.distinctになりました(少なくともRails 5では)。
mrturtle

Rails 3.2では次のことができるLocation.select([:name, :website, :city])ようです:配列を渡した場合
CTS_AE

21

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

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

ところで、これはRails 4です


これが選択された回答であり、質問に最も直接回答します。
マイケルウィルトバンク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.