Rails 3:用户在组织关系中的同事?

时间:2011-12-20 13:05:19

标签: ruby-on-rails database-design optimization relational-database

我有这种关系:

class Organization < ActiveRecord::Base
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :organization
end

我想收集一位用户的同事(即谁加入了同一个组织)。

简单的方法是编写一个这样的方法:

def coworkers
  organization ? organization.users - [self] : []
end

然后我开始思考并觉得我可以通过has_many关系来做到这一点。

我结束了这样做:

class User < ActiveRecord::Base
  belongs_to :organization
  has_many :coworkers, :through => :organization, :source => :users
end

工作得很好除了用户被包含在同事中。

我现在想知道的是:

  • 定义一个像我这样做的好方法吗?
  • 有没有办法使用has_many或任何关系(或其他任何关系)来实现这一点,而无需定义实际方法,并实际排除用户?
  • 关于查询性能,缓存或任何我不知道的重点,哪一个最佳?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以在关系中添加:conditions选项以排除当前用户。例如:

has_many :co_workers, :through => :organization, :source => :users, :conditions => ["user_id != ?", id]

这应该为你做到!

答案 1 :(得分:0)

@davidb:你的答案几乎是正确的,但条件中的id不是调用user.coworkers时评估的id(用户的一个)。

这是要走的路:

  has_many :coworkers, :through => :organization, :source => :users, :conditions => lambda { ["users.id != ?", self.id] }