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?

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.


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


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


Ini harus menjadi jawaban yang dipilih dan paling langsung menjawab pertanyaan.
Michael Wiltbank
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.