2011-03-28 30 views
9

Tôi đã đóng đinh những gì tôi muốn, nhưng tôi dường như không thể làm theo cách mà các nhà thiết kế đường ray đang tìm kiếm. Về cơ bản, tôi có (xin dành pluralization/vấn đề vv):Has_Many: Thông qua hoặc: finder_sql

Nhân Mối quan hệ (phụ huynh, Offspring)

Tôi đang cố gắng để có được tất cả các con cái cho một người mẹ độc thân, và phụ huynh duy nhất cho nhiều offsprings (giả sử chỉ có một phụ huynh cho mỗi con).

tôi có thể làm điều này theo cách sau trong mô hình:

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

tôi phải làm điều này, bởi vì con đường đẹp hơn để làm điều đó:

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

là không thể vì các phím nước ngoài được bỏ qua trong has_many (theo các tài liệu ở đây: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many)

Tuy nhiên, bây giờ tôi nhận được lỗi này:

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)

Tuy nhiên, bất kể tôi hack như thế nào: điều kiện ở đây, nó không xuất hiện: finder_sql muốn tham gia. Có suy nghĩ gì không?

Trả lời

35

gì nếu bạn làm

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

Nữ và Vi trùng, người chiến thắng. Các tài liệu là sai ở đây, bạn không làm một: điều kiện trên: finder_sql, bạn chỉ cần xây dựng nó trong. – aronchick

4

Thực ra, tôi muốn viết nó theo cách này:

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

Tôi nghĩ rằng nó làm cho các hiệp hội dễ hiểu, và nó làm cho SQL khỏa thân dễ dàng hơn để chỉnh sửa. Nó cũng tận dụng lợi thế của nội suy tham số dựa trên chuỗi.

Các vấn đề liên quan