2010-07-26 21 views
7

Kullanıcıların başkalarına gönderdiği mesajlar var. Orada iki model vardır: - mesaj ve: Kullanıcı ve: post aşağıdaki adında dernek vardır:raylar: farklı tablonun iki katıyla aynı tabloyu içerlerken koşulları kullanma

belongs_to :from_user, :class_name => "User", :foreign_key => "from_user_id" 
belongs_to :to_user, :class_name => "User", :foreign_key => "to_user_id" 

ikisi: kullanıcı ve: post gösteren "is_public" sütunu olması yerine tek bir yayın ve/veya tüm ya kullanıcı profili herkese açık veya özel olabilir.

Amacım, herkese açık olan ve alıcının ortak profilleri olan yayınların bir listesini almaktır. Aynı zamanda, db çağrılarının sayısını en aza indirmek için hem gönderen hem de alıcı bilgilerini "dahil etmeyi" istiyorum. Asıl mesele, adı geçen çağrışımlar aracılığıyla aynı tablonun iki kez etkin bir şekilde "dahil edilmesi" dir, fakat "koşulum" da, yalnızca alıcının "is_public" sütununa göre filtrelemeyi sağlamalıyım.

Post.find(:all, :include => [ :to_user, :from_user ], 
    :conditions => { :is_public => true, :to_user => { :is_public => true }}) 

Yani, bir şekilde ben bu "katıl" ek yaparak olduğunu başarabilirsiniz: "koşullar" parametre olarak bir dernek adı kabul etmez çünkü

Aşağıdaki yapamaz "kullanıcılar" tablosu:

Post.find(:all, :include => [ :to_user, :from_user ], 
    :joins => "inner join users toalias on posts.to_user_id = toalias.id", 
    :conditions => { :is_public => true, 'toalias.is_public' => true }) 

Bunu yapmanın daha iyi, belki daha temiz bir yolu var mı? Bu çalıştı

+0

Rails3'te misiniz yoksa hala 2.3.x içinde mi? –

+0

hala 2.3'te.her ikisi için de çözümü görmek isterim – avioing

cevap

1

Sorumumda belirtilenden daha iyi bir çözüm bulamadım. Bu soru için ben çok hoş

Post.find(:all, :include => [ :to_user, :from_user ], 
:joins => "inner join users toalias on posts.to_user_id = toalias.id", 
:conditions => { :is_public => true, 'toalias.is_public' => true }) 
1
ben aynı sorunla karşı karşıya ve raylar sorgudan oluşturulan sql sorgu izledikten sonra bir çözüm bulunmuştur

, sql sorgusu otomatik bir takma ad oluşturur bu deneyin önceden

sayesinde

Post.find(:all, :include => [ :to_user, :from_user ], 
     :conditions => { :is_public => true, 'to_users_posts.is_public' => true }) 

bana :)

0

Eğer Rails 3 üzerindeyseniz, bu tür karmaşık birleşimleri sık sık yapıyorsanız, squeel gem'a bakın. Veya ekstra bir mücevher eklemek istemiyorsanız, Rails 3'teki Arel tablosuna bakın.

0

: bu nedenle bir sorgu derlerken adları/takma adları tabloları Raylar nasıl bağlı değildir ve bu bir (3. taraf taşlar veya eklentileri kullanarak kısa) alternatiflerinden daha temiz görünüyor Çünkü 2 saat kadar uygun bir çözüm bulmaya çalıştım, bu yüzden birkaç ipucu kullandıktan sonra, uygun olanı, benim durumumda çözüm buldum. Benim durumum: created_by_id/updated_by_id alanları tarafından filtre örneklerine ihtiyacım var, bu alanlar her tabloda var, bu yüzden ... ne yaptım Endişe 'Filtrelenebilir' yöntemini yazdım ve bu alanlara göre filtre gerektiğinde bunu kullandım - >

anahtar = "# {key.pluralize} _ # {name.pluralize.downcase} .email" % ağırlık (created_by updated_by) .include olur? (anahtar)

# in case with invoices key = 'updated_bies_invoices.email' 

results = results.eager_load (: created_by,: updated_by) .where ("# {key} =?", Değer)

İlgili konular