2011-03-28 12 views
9

Zepsułem to, co chcę, ale nie mogę tego zrobić tak, jak szukają projektanci szyn. Zasadniczo mam (proszę odstawić pluralizacji/etc zagadnienia):Has_Many: Przez lub: finder_sql

Human Relacje (Rodzic, Potomstwo)

Próbuję uzyskać wszystkie potomstwo dla jednego rodzica, a samotnym rodzicem dla wielu potomstwo (zakłada się tylko jednego rodzica na każde potomstwo).

mogę to zrobić w następujący sposób w modelu

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}' 

Musiałem to zrobić, bo ładniejszy sposób to zrobić:

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

nie jest możliwe, ponieważ kluczy obcych są ignorowane w has_many (zgodnie z dokumentami tutaj: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many)

Jednak teraz otrzymuję ten błąd:

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)

Jednak niezależnie od tego, jak włamuję się do: tutaj warunki, nie wydaje się, że: finder_sql chce uczestniczyć. jakieś pomysły?

Odpowiedz

35

Co jeśli nie

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}" } 
+2

Panie i bakterie, zwycięzca. Dokumenty są tutaj błędne, nie robisz: warunków na: finder_sql, po prostu je skompilujesz. – aronchick

4

Właściwie chciałbym napisać to w ten sposób:

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}" 

Myślę, że to sprawia, że ​​stowarzyszenie łatwiej zrozumieć, a sprawiają, że łatwiej jest nagi SQL edytować. Korzysta również z interpolacji parametrów opartych na łańcuchach.

Powiązane problemy