2011-03-28 6 views
9

나는 원하는 것을 단련했지만, 레일 설계자가 찾고있는 방식으로는 얻을 수 없다. 기본적으로,이 (따로 설정하십시오 복수화/등 문제) :Has_Many : through 또는 : finder_sql

인간 관계 (부모, 자손)

내가 하나의 부모에 대한 모든 오프 스프링을 얻으려고 많은 대한 하나의 부모 자손 (자손 당 하나의 부모 만 가정).

I 모델에서 다음과 같은 방법으로이 작업을 수행 할 수 있습니다

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

좋네요 방법은 그것을 할 수 있기 때문에 나는이 일을했다 :

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

은 불가능 외래 키 때문에 has_many에서 무시됩니다. (여기의 문서에 따르면 : http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many)

그러나 이제 오류가 발생합니다.

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)

그러나 여기에 나와있는 조건을 해킹해도 상관 없습니다. finder_sql이 참여하려고합니다. 이견있는 사람? 내가 이해 협회 쉽게 생각

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

, 그것은에 알몸 SQL 쉽게 : 당신이

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

답변

35

편집하다. 또한 문자열 기반 매개 변수 보간을 활용합니다.

+2

수상자 인 Ladies and Germs. 문서가 잘못되었으므로 다음을 수행하지 마십시오 : finder_sql에 대한 조건. – aronchick

4

사실한다면, 내가이 방법을 써서 무엇

관련 문제