兄弟姐妹在很多关系中

时间:2009-10-26 08:55:08

标签: ruby-on-rails activerecord

用户有很多就业机会。

你怎么看? 这是获取给定就业对象的所有兄弟姐妹(属于同一用户)的有效且清晰的方式吗?

class Employment < ActiveRecord::Base
  belongs_to :user

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

可以使用以下命名范围进行扩展:

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

现在我可以做类似的事情:

  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))

非常欢迎像'不,你滥用XY,而是使用这个XZ'这样的评论!

Reto

1 个答案:

答案 0 :(得分: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上调用命名范围。虽然以这种方式做事意味着你不能分配给兄弟姐妹。兄弟姐妹的电话有点清洁。可能会有性能提升,但可能不会产生重大影响。