我有两个模型:Reader
和Magazine
。我显然希望有一个联接表readers_magazines
来表示每个读者订阅的杂志。
所以我创建了我的Reader
模型(包含name
,address
和age
)以及我的Magazine
模型(包含{{1}等字段}和Title
)。在每个模型中,我写了另一个模型的Active?
。
然后我写了一个迁移has_and_belongs_to_many
,然后写:
CreateReadersMagazinesJoin
迁移数据库。一切都好。
我的问题是......现在怎么办?我是否为连接表创建模型?这似乎是错误的,但我确实需要一些模型验证(我不想两次表示相同的用户订阅组合)。那么我是否为它编写模型并手动指定要使用的数据库表?
在这种情况下,正确的程序是什么?
答案 0 :(得分:0)
来自rails guide s:
has_and_belongs_to_many关联创建直接的多对多关系 与另一个模型的连接,没有介入模型。
这意味着使用has_and_belongs_to_many
关联可能更容易设置(因为没有中间模型),但您不能对连接表,验证等进行任何控制。 HABTM通常被认为是有害的,您可能希望使用has_many :through
关系,但它具有相同的模型来表示连接表,因此您可以控制所有内容。
更多信息here。
答案 1 :(得分:0)
我是否为联接表创建模型?这似乎是错误的,但我确实需要一些模型验证。
如果您不想在联接表中添加其他字段,则不需要为其创建模型。
在大多数情况下,您所需的验证可以应用于一个或两个表。
我不想两次代表相同的用户订阅组合。
你是什么意思两次,我没有看到这种情况,但是由于User
- Subscription
是连接表外部的东西,你可以解释更多的crear。
答案 2 :(得分:0)
如果您可以选择habtm关系或单独的模型,我会考虑您是否需要在连接中提供大量数据。在目前的情况下,我认为你需要在连接中需要额外的数据。例如,订阅将具有开始日期和结束日期。它还可能有结算日期和结算金额。您通常不会在连接表中填充此信息,而是在独立模型中填充。
答案 3 :(得分:0)
我会调用连接表subscriptions
,从而创建一个模型Subscription
。然后你就可以这样做:
class Reader < ActiveRecord::Base
has_many :subscriptions
has_many :magazines, through: :subscriptions
end
class Subscription < ActiveRecord::Base
beongs_to :reader
belongs_to :magazine
end
class Magazine < ActiveRecord::Base
has_many :subscriptions
has_many :readers, through: :subscriptions
end