Scaffolding ActiveRecord:两列相同的数据类型

Ada*_*ich 23 ruby activerecord ruby-on-rails scaffolding

另一个基本的Rails问题:

我有一个数据库表,需要包含对特定数据类型的两个不同记录的引用.

假设的例子:我正在制作视频游戏数据库.我有一张"公司"表.我希望每个"Videogame"条目只有一个开发人员和一个发布者.

我知道,如果我想拥有一家公司,我可以做以下事情:

script/generate Videogame company:references
Run Code Online (Sandbox Code Playgroud)

但我需要两家公司.我宁愿不使用连接表,因为只能有两个给定的数据类型,我需要它们是不同的.

似乎答案应该非常明显,但我无法在互联网上的任何地方找到它.

Jon*_*ood 48

只是为了整理一下,在您的迁移中,您现在也可以:

create_table :videogames do |t|
  t.belongs_to :developer
  t.belongs_to :publisher
end
Run Code Online (Sandbox Code Playgroud)

因为你正在调用密钥developer_id和publisher_id,所以模型应该是:

belongs_to :developer, :class_name => "Company"
belongs_to :publisher, :class_name => "Company"
Run Code Online (Sandbox Code Playgroud)

这不是一个主要问题,但我发现随着额外参数的关联数量增加,事情变得越不清晰,所以最好尽可能坚持默认值.


mli*_*bby 9

我不知道如何使用script/generate执行此操作.

无论如何不使用脚本/生成更容易显示基本思想.您希望视频游戏表/模型中有两个字段,用于保存公司表/模型的外键.

我会告诉你我认为代码会是什么样子,但我还没有测试过,所以我可能错了.

您的迁移文件包含:

create_table :videogames do |t|
  # all your other fields
  t.int :developer_id
  t.int :publisher_id
end
Run Code Online (Sandbox Code Playgroud)

然后在你的模型中:

belongs_to :developer, class_name: "Company", foreign_key: "developer_id"
belongs_to :publisher, class_name: "Company", foreign_key: "publisher_id"
Run Code Online (Sandbox Code Playgroud)

您还提到希望两家公司不同,您可以在模型中进行验证,以检查它developer_id != publisher_id.