假设我们有教练,客户和用户。
以非继承方式对此进行建模的理想方法是什么?我想避开STI。
现在我有这样的事情:
user.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
coach.rb
belongs_to :user
belongs_to :client, :class_name => "User"
但是,处理一个被称为“教练”的User对象并且必须键入user.coach_users以获取由该特定用户指导的用户集合时,这感觉非常笨拙。
感觉非常不恰当,老实说,这只是简单的混乱,我讨厌它。我想要更优雅的东西。
我想删除连接模型,并且在user.rb模型上只有两个has_many,但它仍然感觉笨重,特别是违反对象角色的icky感觉。这些是不同的角色,但也非常相似,因为他们都是用户。你如何以优雅的方式将这种常见逻辑与Rails和Ruby以正确的惯用方式分开?
“网站的用户”可以而不是coach
或client
。
如果建模只需要一个关系,那么我可以看到它是一个HABTM,但如果个人关系需要额外的逻辑呢?例如客户或教练的额外逻辑?你会混合一个在User模型中定义逻辑的类吗?或者你会为这段关系创建单独的AR模型,如果是,怎么做?
答案 0 :(得分:1)
如果client
/ coach
只是一种关系,那可能只是一种关系,而不是一个单独的模型。因此,您可以在has_and_belongs_to_many
之间建立Users
关系。使用以下命令创建迁移:
def up
create_table :coaches_clients do |t|
t.integer :coach_id
t.integer :client_id
end
end
在你的模特中:
has_and_belongs_to_many :clients,
:foreign_key => 'client_id',
:association_foreign_key => 'coach_id',
:class_name => 'User',
:join_table => 'coaches_clients'
has_and_belongs_to_many :coaches,
:foreign_key => 'coach_id',
:association_foreign_key => 'client_id',
:class_name => 'User',
:join_table => 'coaches_clients'