2009-10-26 110 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