2013-04-19 19 views
6

diğer sütunların herhangi sitesinin ben sadece bir Foo 'ın User ismini istediğinizi varsayalım değil, ActiveRecord derneklerinden yalnızca belirli sütunları istemek mümkün müdür?

def Foo 
    has_one :user 
end 

düşünün. böylece yalnızca bir sütun almak için dernek kullanmak için herhangi bir kaygan yol yoktur i

SELECT name FROM "users" WHERE "prices"."id" = 123 

istiyorum ama yapıyor foo.user.name bana

SELECT * FROM "users" WHERE "prices"."id" = 123 

verecek? Bu sadece değerler dönecektir

User.select(:name).where(...) 

: Eğer gibi .Select yöntemi kullanarak seçmek istediğinizi sütunları belirtebilirsiniz

User.where(id: foo.user_id).pluck(:name).first 

cevap

4

Genel olarak: değilse, o zaman ben yapmak zorunda ad sütunu. Bunu bir ilişkilendirmeye, ancak bir örneğe zincirleme yapabilirsiniz. Bu yüzden, meagar çok agresif bir şekilde diğer cevapları (Mori'nin silinen cevabı dahil) indirerek işaret ettiği gibi, bir has_one ilişkisinde, bunu ilişkide zincirleyemezsiniz (çünkü bu durumda bir ilişki değildir). Ancak, bu gibi özel bir kapsamı inşa edebileceğini:

class Foo < ActiveRecord::Base 
    has_one :bar 
    scope :bar_name, lambda {Bar.select(:name).where(:foo_id=> id)} 
end 

bunu tweak gerekebilir, ancak genellikle bu yaklaşımı konuşma gibi bir şey yapmayı sağlayacak nedenle yukarıdaki test edilmedi:

foo.bar_name 

... tüm sütunları Bar'dan yüklemeden.

+0

Bunun kapsamı temsilci olabilir mi? Bir kapsam genellikle ActiveRecord :: İlişkisi verir, boş veya değil. Bir yöntem daha uygun (veya delege edilebilir mi?) – MrYoshiji

+0

Eh, bu bir ActiveRecord sorgu yöntemleri zinciridir, bu yüzden bir ilişki döndürdüğünü düşünüyorum - bununla ilgili tek garip şey, bunun yerine Bar sınıfında yerleşik bir ilişki döndürmesidir. Foo sınıfının - ama bir kez bir şeylere gittiniz. (başka bir deyişle, bunu zaten yapıyorsunuz). Bir yöntemin tanımlanması, bunun için de olsa iyi bir yol olacaktır. Böyle bir şey yapmaya hiç gerek duymadım, bu yüzden hangisinin daha iyi ya da neden olduğu konusunda bir referans çerçevem ​​yok. – Andrew

1

Hayır, sizin has_one durumunuzda, ancak has_many durumunda evet.

has_one ilişkilendirmesi için döndürülen nesne, has_many ile olduğu gibi select gibi ek yöntemleri zincirleyebileceğiniz bir kapsam değildir. Bu, modelin gerçek bir örneğidir ve onu örnekleme, mutlaka bir select * içermelidir.

Sadece adı seçmek istiyorsanız, User modeline doğrudan erişmeniz ve select modelini kullanmanız gerekir. senin Foo birçok users varsa

Tersine, bir gerçek ActiveRecord dernek değil, bir modelin bir örnek olacağını foo.users olarak, foo.users.select("name") veya diğer chainable yöntemlerden birini kullanabilirsiniz.

İlgili konular