假设我们有教练、客户和用户。
以非继承的方式对此进行建模的理想方法是什么?我想避免性传播感染。
现在我有这样的事情:
用户.rb
has_many :coaches, :foreign_key => :client_id
has_many :coach_users, :through => :coaches, :source => :user
has_many :clients, :class_name => "Coach"
has_many :client_users, :through => :clients, :source => :client
def is_a_coach_of?(client)
self.client_users.include?(client)
end
def is_a_client_of?(coach)
self.coach_users.include?(coach)
end
教练.rb
belongs_to :user
belongs_to :client, :class_name => "User"
但是,处理一个据称是“教练”的用户对象并且必须键入 user.coach_users 来获取由该特定用户指导的用户集合,这感觉真的很笨拙。
感觉非常不习惯,老实说,这只是令人困惑,我讨厌它。我想要更优雅的东西。
我想删除连接模型,只在 user.rb 模型上有两个 has_many,但它仍然感觉很笨拙,尤其是违反对象角色的恶心感觉。这些是不同的角色,但也非常相似,因为它们都是用户。您如何以优雅的方式,以正确的惯用方式与 Rails 和 Ruby 分离这些常见的逻辑?
“站点的用户”可以存在而不是 acoach
或 a client
。
如果建模只需要一个关系,那么我可以看到它是一个 HABTM,但是如果单个关系需要额外的逻辑怎么办?例如,客户或教练的额外逻辑?你会在 User 模型中混入一个定义逻辑的类吗?或者您会为这种关系创建单独的 AR 模型,如果是,如何创建?