ActiveRecord menemukan dan hanya mengembalikan kolom yang dipilih

90

edit 2

Jika Anda menemukan ini, periksa kedua jawaban karena saya sekarang akan menggunakan petik untuk ini


Saya memiliki kumpulan data khusus yang cukup besar yang ingin saya kembalikan untuk di-echo-kan sebagai json. Satu bagian adalah:

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

tapi saya ingin melakukan sesuatu seperti:

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

tapi ini sepertinya tidak berhasil. Bagaimana saya membuat ini bekerja?

Terima kasih

edit 1 sebagai
alternatif, apakah ada cara agar saya dapat melewatkan array yang hanya berisi atribut yang ingin saya sertakan?

timpone
sumber

Jawaban:

87

Di Rails 2

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

...atau...

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

Dokumen referensi ini memberi Anda daftar lengkap opsi yang dapat Anda gunakan .find, termasuk cara membatasi menurut angka, id, atau kolom / batasan arbitrer lainnya.

Di Rails 3 dengan Antarmuka Kueri ActiveRecord

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

Ref: Antarmuka Kueri Rekaman Aktif

Anda juga dapat menukar urutan panggilan yang dirantai ini, melakukan .select(...).where(...).first- semua panggilan ini lakukan adalah membuat kueri SQL dan kemudian mengirimkannya.

jefflunt
sumber
tapi saya hanya ingin satu contoh tidak semua
timpone
Saya mengedit jawaban saya. :limitharus melakukan ini, atau :firstatau :lastatau apa pun, tergantung pada apa yang Anda inginkan. Dokumen referensi yang saya tautkan akan memberi tahu Anda bagaimana melakukan semua itu.
jefflunt
Diperbarui untuk menyertakan cara melakukan kueri yang setara di Rails 3.
jefflunt
205

memetik (nama_kolom)

Metode ini dirancang untuk melakukan pemilihan dengan satu kolom sebagai kueri SQL langsung. Mengembalikan Array dengan nilai dari nama kolom yang ditentukan Nilai memiliki tipe data yang sama dengan kolom.

Contoh:

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)

lihat http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

Rel yang diperkenalkan 3.2 dan seterusnya dan hanya menerima satu kolom. Di rel 4, ini menerima banyak kolom

prasad.surase
sumber
1
Oke, memetik dengan banyak kolom itu luar biasa .. baru saja pelajari dari jawaban ini. Rails 3 membutuhkan jawaban yang diterima.
Jay Shepherd
Jawaban yang diterima adalah benar karena petik tidak tersedia saat itu.
prasad.surase
User.pluck (: email,: id) PILIH "users". "Email", "users". "Id" FROM "users"
pranav prashant
2
Model.uniq sekarang menjadi Model.distinct (setidaknya di Rails 5).
mrturtle
Tampaknya Anda dapat melakukan hal berikut di rails 3.2: Location.select([:name, :website, :city])jika Anda meneruskannya sebuah array
CTS_AE
25

Jawaban saya datang cukup terlambat karena saya adalah pengembang yang cukup baru. Inilah yang dapat Anda lakukan:

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

Btw, ini Rails 4

tkhuynh.dll
sumber
Ini harus menjadi jawaban yang dipilih dan paling langsung menjawab pertanyaan.
Michael Wiltbank