如何在Rails中添加项目以连接表?他们有自己的模特吗?

时间:2014-12-14 07:21:34

标签: ruby-on-rails

我有两个模型:ReaderMagazine。我显然希望有一个联接表readers_magazines来表示每个读者订阅的杂志。

所以我创建了我的Reader模型(包含nameaddressage)以及我的Magazine模型(包含{{1}等字段}和Title)。在每个模型中,我写了另一个模型的Active?

然后我写了一个迁移has_and_belongs_to_many,然后写:

CreateReadersMagazinesJoin

迁移数据库。一切都好。

我的问题是......现在怎么办?我是否为连接表创建模型?这似乎是错误的,但我确实需要一些模型验证(我不想两次表示相同的用户订阅组合)。那么我是否为它编写模型并手动指定要使用的数据库表?

在这种情况下,正确的程序是什么?

4 个答案:

答案 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