SORU
15 Mart 2011, Salı


Raylar ilişkili kayıt no 3 olan kayıtları bulmak istiyorum

Basit bir dernek düşünün...

class Person
   has_many :friends
end

class Friend
   belongs_to :person
end

Öncesinde ve/veya meta_where HİÇ arkadaşları olan kişiler için en temiz yolu nedir?

Ve sonra bir has_many :sürüm ile ilgili

class Person
   has_many :contacts
   has_many :friends, :through => :contacts, :uniq => true
end

class Friend
   has_many :contacts
   has_many :people, :through => :contacts, :uniq => true
end

class Contact
   belongs_to :friend
   belongs_to :person
end

Gerçekten has_many :ile olmuyor okuduğum kadarıyla counter_cache - ve ben kullanmak istemiyorum

Tüm insan çekmek istemiyorum.Ruby kayıtları ve döngü onları arkadaş - meta_search gem ile kullanabileceğim sorgu/kapsam istiyorum

Sorgular, performans maliyet umurumda değil

Ve gerçek SQL daha uzağa, daha uzağa...

CEVAP
6 NİSAN 2011, ÇARŞAMBA


Daha iyi:

Person.includes(:friends).where( :friends => { :person_id => nil } )

Temelde aynı şey, hmt için, hiç arkadaşı olmayan bir kişi de temasları olacak aslında güveniyor:

Person.includes(:contacts).where( :contacts => { :person_id => nil } )

Güncelleme

Yorum has_one hakkında bir sorum var, sadece güncelleme. Burada hile includes() dernek adına beklediği ama where tablo ismini bekliyor. has_one Derneği Genel değişiklikler yani tekil olarak ifade edilmiştir, edilecektir, ama where() parçası olarak kalır. Person has_one :contact sadece bir eğer deyim olur:

Person.includes(:contact).where( :contacts => { :person_id => nil } )

Güncelleme 2

Biri insanlar hakkında ters, arkadaş istedi. Olarak yorumladı aşağıda, bu gerçekten anlamamı sağladı bu son alan (yukarıda: :person_id) yok aslında olması ile ilgili modelisin dönen, sadece bir alanda birleştirme tablo. Bunlardan herhangi biri olabilir nil olacaklar. Bu yukarıdaki daha basit bir çözüm neden olur

Person.includes(:contacts).where( :contacts => { :id => nil } )

Ve sonra bu insanlar daha basit hale ile arkadaş geri geçiş, ön tek sınıf değiştirme:

Friend.includes(:contacts).where( :contacts => { :id => nil } )

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Enge

    Eric Enge

    2 Kasım 2009
  • The Onion

    The Onion

    14 Mart 2006
  • Top10Series

    Top10Series

    26 Kasım 2008