Saya sudah memiliki solusi yang berfungsi, tetapi saya benar-benar ingin tahu mengapa ini tidak berhasil:
ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }
Itu memilih, tetapi tidak mencetak nilai unik, itu mencetak semua nilai, termasuk duplikat. Dan itu ada di dokumentasi: http://guides.rubyonrails.org/active_record_querying.html#seleksi-specific-fields
ruby-on-rails
activerecord
alexandrecosta
sumber
sumber
Jawaban:
Hasil dari ini adalah kumpulan
Model
benda. Bukan peringkat biasa. Dan dariuniq
sudut pandang, mereka sangat berbeda. Anda bisa menggunakan ini:atau ini (paling efisien)
Memperbarui
Rupanya, pada rail 5.0.0.1, itu hanya berfungsi pada permintaan "tingkat atas", seperti di atas. Tidak berfungsi pada proksi koleksi (hubungan "has_many", misalnya).
Dalam hal ini, hapus duplikat setelah kueri
sumber
Model.uniq.pluck(:rating)
ini adalah cara paling efisien untuk melakukan ini - ini menghasilkan SQL yang menggunakanSELECT DISTINCT
daripada menerapkan.uniq
ke arrayModel.uniq.pluck(:rating)
akanModel.distinct.pluck(:rating)
Model.related_records.group(:some_column).pluck(:some_column)
Jika Anda akan menggunakan
Model.select
, maka sebaiknya Anda gunakan sajaDISTINCT
, karena hanya akan mengembalikan nilai-nilai unik. Ini lebih baik karena itu berarti mengembalikan lebih sedikit baris dan harus sedikit lebih cepat daripada mengembalikan sejumlah baris dan kemudian memberi tahu Rails untuk memilih nilai-nilai unik.Tentu saja, ini disediakan database Anda memahami
DISTINCT
kata kunci, dan sebagian besar harus.sumber
Model.select("DISTINCT rating").map(&:rating)
untuk mendapatkan berbagai peringkat saja.Ini juga berfungsi.
sumber
pluck
adalah metode Rails> 3.2 murni yang tidak memiliki ketergantungan pada Ruby 1.9.x Lihat apidock.com/rails/v3.2.1/ActiveRecord/Calculations/pluckJika Anda ingin juga memilih bidang tambahan:
sumber
select extra fields
<3 <3Ini memiliki keuntungan karena tidak menggunakan string sql dan tidak membuat model instantiating
sumber
Kode ini berfungsi sebagai 'DISTINCT' (bukan sebagai Array # uniq) sejak rails 3.2
sumber
sumber
.pluck(:rating)
pada akhirnya akan membuatnya persis seperti yang diminta OP.Jika saya langsung ke jalan maka:
Permintaan saat ini
mengembalikan array objek dan Anda telah menulis kueri
uniq diterapkan pada array objek dan setiap objek memiliki id unik. uniq melakukan tugasnya dengan benar karena setiap objek dalam array adalah uniq.
Ada banyak cara untuk memilih peringkat yang berbeda:
atau
atau
atau
Satu hal lagi, permintaan pertama dan kedua: cari data berbeda dengan query SQL.
Kueri ini akan dianggap "london" dan "london" yang sama artinya akan diabaikan ke ruang angkasa, itu sebabnya ia akan memilih 'london' satu kali dalam hasil permintaan Anda.
Kueri ketiga dan seterusnya:
menemukan data dengan query SQL dan untuk data yang berbeda diterapkan ruby uniq mehtod. kueri ini akan dianggap "london" dan "london" berbeda, karena itu ia akan memilih 'london' dan 'london' di hasil kueri Anda.
lebih suka gambar terlampir untuk lebih memahami dan melihat "Tur / Menunggu RFP".
sumber
map
&collect
alias untuk metode yang sama, tidak perlu memberikan contoh untuk keduanya.Beberapa jawaban tidak memperhitungkan OP menginginkan array nilai
Jawaban lain tidak berfungsi dengan baik jika Model Anda memiliki ribuan catatan
Yang mengatakan, saya pikir jawaban yang bagus adalah:
Karena, pertama-tama Anda menghasilkan larik Model (dengan ukuran yang berkurang karena pilih), kemudian Anda mengekstrak satu-satunya atribut yang dimiliki oleh model yang dipilih (peringkat)
sumber
Jika ada yang mencari yang sama dengan Mongoid, itu
sumber
Cara lain untuk mengumpulkan kolom uniq dengan sql:
sumber