2017-04-03 155 views
0

我试图找出一种方法来定义一个belongs_to关联,其中可以通过4个不同列之一找到目标记录。设置:Rails belongs_to与多个外键的关联

用户

class User < ActiveRecord::Base 
    has_many :managerships, foreign_key: :employee_id 
    has_many :managers, through: :managerships 
end 

管理者来说

class Managership < ActiveRecord::Base 
    belongs_to :employee, class_name: 'User' 
    belongs_to :manager # <-- ideas? 
end 

managerships表有4列manager_idmanager_custom_idmanager_emailmanager_saml_id,我们可以用它来查找用户的管理者。对于每个Managership,这些列中只有一列出现。

我正在寻找一种方法能够调用user.managers(经理是User),以便它返回的所有用户,其中managerships.manager_id = users.id OR managerships.manager_custom_id = users.custom_id OR managerships.manager_email = users.email OR managerships.manager_saml_id = users.saml_id

非常感谢您的任何想法!

回答

0

尽管我怀疑一个关系的4个外键是一个好主意,但从User获取管理器的一种方法是使用方法而不是范围。但是,如果你这样做,你将无法使用#joins

class User 
    def managers 
    self.class.joins(:managerships).where('managerships.manager_id = ? OR managerships.manager_custom_id = ? OR managerships.manager_email = ? OR managerships.manager_saml_id', id, custom_id, emd, saml_id) 
    end 
end 

Managership你可以做类似的事情,申报#manger代替belongs_to :manager

+0

谢谢你,尼基塔。虽然这可能是要走的路,但它不会回报经理。 'self.class.joins(:managerships)'将返回所有拥有管理员的用户(请参阅'has_many:managerships,foreign_key :: employee_id'),而不是管理员本身 –

+0

@JanKlimo是的。让我对sql进行思考,这不会是一件容易的事情:/ –

相关问题