【问题标题】:What would the right Rails model association be in this case?在这种情况下,正确的 Rails 模型关联应该是什么?
【发布时间】:2017-02-24 07:59:32
【问题描述】:

我正在尝试学习 Rails,但有一个问题让我有点困惑。我有两个简单的模型:Media 和 MediaType。

媒体有:标题、生产日期、成本等。它还有一个“类型”字段。这将是 MediaType 表的外键。 MediaType 很简单:id、name、active (t/f)。

当我想到这一点时,Media has_one MediaType 似乎很合适。但我也可以看到 Media belongs_to MediaType 和 MediaType has_many Media 也适合。从我的 POV 来看,我真正需要的是让 Media 表存储查看 MediaTypes 表的 ID。 MediaTypes 表不应该存储有关 Media 的任何内容,因此我指向“has_one”。

哪个是正确的?每个人都使用什么过程来思考这些问题?

编辑:对于这个例子,我希望 Media 永远只有一种类型。

【问题讨论】:

  • 这取决于媒体和媒体类型的含义。您应该问自己一个问题:一种媒体类型可以有多种媒体吗?或者它可以只有一种媒体?
  • 如上所述,让我们保持简单。媒体只能有 1 种类型。

标签: ruby-on-rails


【解决方案1】:

我个人的建议是废弃媒体类型模型并将其作为媒体模型的字段/列。它总共只有两个相关字段(名称和类型),因为您不需要 id,因为仅在假设它是自己的单独表的情况下才真正需要识别媒体类型。您将只是消除不必要的复杂性(可以只有一个数据库表而不是两个)。只有当两个表的列都太大而无法存储在一个表中时,一对一关系才真正有意义。

如果您绝对必须包含它,那么以下应该可以工作:

class Media < ActiveRecord::Base
  belongs_to :media_type
end

class MediaType < ActiveRecord::Base
  has_one :media
 end

请注意,带有belongs_to 的模型将是存储另一个模型的外键的模型。在这种情况下,因为您希望 Media 存储 MediaTypes,所以您需要指定 Media 与 MediaType 具有belongs_to 关系。为模型 MediaType 编写 has_one :media 将完成一对一的关系。

在您的迁移表中,您必须将 media_type_id 作为一列包含在 Media 模型的迁移中,以便可以存储一对一的关系。然后,您将能够存储哪些媒体类型进入哪些媒体记录。

【讨论】:

  • 这是对选项的很好解释以及为什么选择它,并且应该可以帮助我在下次需要查看关系时进行处理,谢谢。快速的最后一个问题,我是否需要在迁移中手动添加外键,或者关联是否为我这样做?
  • Rails 会将 Association_id 的单数形式视为外键。在这种情况下,一旦您将media_type_id 作为媒体表上的一列,它将自动从media_type 中获取 id,并将其用作媒体表上的外键。尽管 Rails 会将media_type_id 视为外键,但实际上并没有将外键添加到 sql 表中。您将不得不使用add_foreign_key(迁移方法)或自己做。请参阅guides.rubyonrails.org/… 了解更多详情。
  • 请注意,在 Rails 应用程序中的数据库中具有外键并不是绝对必要的,但是如果您希望模型查询和 SQL 表之间的完整性,您可以根据需要添加它们。
【解决方案2】:

type 不是列的好名称,如其他答案所指出的,将其重命名为 media_type_id

# media.rb
class Media < ActiveRecord::Base
  belongs_to :media_type
end

# media_type.rb
class MediaType < ActiveRecord::Base
  has_many :media
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2012-01-29
    • 2015-09-25
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多