ActiveRecord seçili sütunları bulur ve yalnızca döndürür


91

düzenleme 2

Buna rastlarsanız, şimdi bunun için koparmak kullanacağım için iki yanıtı da kontrol edin


Json olarak yankılanmak üzere geri dönmek istediğim oldukça büyük bir özel veri kümem var. Bir bölümü:

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

ama şöyle bir şey yapmak istiyorum:

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

ama bu işe yaramıyor gibi görünüyor. Bunu nasıl çalıştırırım?

Teşekkür

düzenle 1
alternatif olarak, yalnızca dahil edilmesini istediğim niteliklerin bir dizisini geçirebilmemin bir yolu var mı?

Yanıtlar:


87

Raylarda 2

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

...veya...

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

Bu referans belgesi , .findsayı, kimlik veya diğer herhangi bir rastgele sütun / kısıtlama ile nasıl sınırlandırılacağı dahil olmak üzere kullanabileceğiniz seçeneklerin tam listesini verir .

In Rails 3 w / ActiveRecord Sorgu Arayüzü

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

Ref: Aktif Kayıt Sorgu Arayüzü

Ayrıca, bu zincirleme çağrıların sırasını da değiştirebilirsiniz .select(...).where(...).first- tüm bu çağrıların yaptığı SQL sorgusunu oluşturmak ve sonra onu göndermek.


ama sadece tek bir bütün örneğini istiyor
Timpone

Cevabımı düzenledim. ne istediğine bağlı olarak :limitbunu ya da :firstya :lastda her neyse onu yapmalısın. Bağlandığım referans belge size bunların nasıl yapılacağını anlatacak.
jefflunt

Rails 3'te eşdeğer bir sorgunun nasıl yapılacağını içerecek şekilde güncellendi
jefflunt

206

pluck (sütun_adı)

Bu yöntem, doğrudan SQL sorgusu olarak tek bir sütuna göre seçim gerçekleştirmek için tasarlanmıştır, belirtilen sütun adı değerleriyle Dizi Dönüşleri Değerler, sütunla aynı veri türüne sahiptir.

Örnekler:

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)

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

Piyasaya sürülen rayları 3.2'den itibaren ve yalnızca tek sütunu kabul eder. Raylarda 4, birden çok sütunu kabul eder


1
Tamam, birden fazla sütun ile koparmak harika .. bunu bu cevapta öğrendim. Rails 3 kabul edilen cevaba ihtiyaç duyuyor.
Jay Shepherd

Kabul edilen cevap doğru çünkü o zaman koparma mevcut değildi.
prasad.surase

User.pluck (: email,: id) SELECT "users". "Email", "users". "İd" FROM "kullanıcılar"
pranav prashant

2
Model.uniq artık Model.distinct olmuştur (en azından Rails 5'te).
mrturtle

Görünüşe göre raylar 3.2'de şunları yapabilirsiniz: Location.select([:name, :website, :city])eğer bir diziyi
geçirirseniz

27

Cevabım oldukça geç geldi çünkü oldukça yeni bir geliştiriciyim. Yapabilecekleriniz bu:

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

Btw, burası Rails 4


Bu seçilen yanıt olmalı ve soruyu en doğrudan yanıtlamalıdır.
Michael Wiltbank
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.