2011-03-28 23 views
9

İstediğimi aşağı çektim, ancak rayların tasarımcılarının aradığı bir şekilde göremiyorum. Temelde, sahip (bir kenara lütfen çoğulculuk/vb konular):Has_Many: Through or: finder_sql

İnsan İlişkiler (Veli, Offspring)

Ben, tek ebeveyn için tüm Yavrularda almaya çalışıyorum ve birçok tek ebeveynli offsprings (her bir yavru için yalnızca bir ebeveyn üstlenin).

Ben modelde şu şekilde yapabilirsiniz:

has_one  :parent, :through => :relationships, :foreign_key => :human_id, :source => :source_human 
has_many :offsprings, :finder_sql => 
      'SELECT DISTINCT offsprings.* ' + 
      'FROM humans offsprings INNER JOIN relationships r on ' + 
      'r.human_id = offsprings.id where r.source_human_id = #{id}' 

güzel şekilde yapmak, çünkü bunu yapmak zorunda:

has_many :offsprings, :through => :relationships, :foreign_key => :source_human_id, :source => :human 

mümkün değil mi yabancı anahtarları çünkü (burada docs göre: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many) has_many göz ardı edilir

Ancak, şimdi bu hatayı alıyorum:

DEPRECATION WARNING: String-based interpolation of association conditions is deprecated. Please use a proc instead. So, for example, has_many :older_friends, :conditions => 'age > #{age}' should be changed to has_many :older_friends, :conditions => proc { "age > #{age}" }. (called from irb_binding at (irb):1)

Ancak, nasıl hack yapıyorum olursa olsun: burada koşullar, görünmüyor: finder_sql katılmak istiyor. Düşüncesi olan var mı? Ben bunu anlamak dernek kolaylaştırır düşünüyorum

has_many :offsprings, :finder_sql => proc {OFFSPRING_SQL % {id: id}} 

OFFSPRING_SQL = "SELECT DISTINCT offsprings.* 
        FROM humans offsprings 
        INNER JOIN relationships r 
         ON r.human_id = offsprings_id 
         WHERE r.source_human_id = %{id}" 

ve çıplak SQL kolaylaştırmak: Eğer

has_many :offsprings, :finder_sql => 
      proc { "SELECT DISTINCT offsprings.* " + 
      "FROM humans offsprings INNER JOIN relationships r on " + 
      "r.human_id = offsprings.id where r.source_human_id = #{id}" } 

cevap

35

Düzenle. Ayrıca string tabanlı parametre enterpolasyonundan yararlanır.

+2

Bayanlar ve Germler, kazanan. Dokümanlar burada yanlış, sen yapmıyorsun: koşullar: finder_sql, sadece onu inşa et. – aronchick

4

Aslında bunu yaparsanız, ben bu şekilde yazacağımı Ne