2009-10-26 108 views
1

用戶有很多就業機會。has_many關係中的Sil魚

您認爲如何? 這是一種有效且清晰的方式來獲取給定僱傭對象的所有兄弟姐妹(屬於同一用戶)?

self.silblings.except(self.id).each do |silbling| 
    puts silbling 
    end 

產生的SQL語句如下:

SELECT * FROM `employments` 
    WHERE (`employments`.user_id = 49) 
    AND ((id != 46) AND (`employments`.user_id = 49)) 

named_scope :except, lambda {|id| {:conditions => ["id != ?", id]} if id} 

現在,像我可以做的東西:

class Employment < ActiveRecord::Base 
    belongs_to :user 

    has_many :silblings, 
    :primary_key => :user_id, 
    :foreign_key => :user_id, 
    :class_name => 'Employment' 
end 

這可以用下面的命名範圍擴大

評論'不,你濫用XY,而使用這個XZ'非常受歡迎!

Reto

回答

3

看起來不錯。除了查詢中的SQL翻倍('employments'.user_id = 49)。這並不重要。如果這是你真的不想要的東西,你可以去定義這樣的兄弟姐妹:

class Employment < ActiveRecord::Base 
    belongs_to :user 

    named_scope :for_user, lambda { |user| 
    { :conditions => {:user_id => user} } 
    } 

    named_scope :except, lambda {|employment| 
    {:conditions => ["id != ?", employment} 
    } 

    def siblings 
    Employment.for_user(user_id).except(id) 
    end 

end 

信不信由你,你仍然可以撥打@employment.siblings命名範圍。儘管以這種方式做事意味着你不能分配給兄弟姐妹。兄弟姐妹的電話出來一點清潔劑。可能會有性能改進,但它可能不會有重大影響。

+0

for_user看起來更乾淨,更簡單,更好。它不那麼通用,但更加明確。我想我會去做的。重複是一個無關的錯誤。我在發佈問題後不久發現了相應的錯誤報告:https://rails.lighthouseapp.com/projects/8994/tickets/2923 感謝您的輸入。 – reto 2009-10-26 10:42:54