在Rails中创建子表时,您必须指定父键,还是关联会自动为您执行此操作?

问题描述 投票:0回答:2

我不敢相信我仍然不知道这一点……如果我要创建一个属于父级Fruit的新表Basket,我是否必须在迁移文件中写入它:

create_table :fruits do |t|
  t.integer :basket_id
  ...
end

或者这样做是否足够:

create_table :fruits do |t|
  t.belongs_to :basket
  ...
end

当然,将适当地设置模型文件:

class Fruit
  belongs_to :basket
end

class Basket
  has_many :fruits
end

还是取决于版本和/或情况(例如,一种方式或另一种方式实际上存在根本差异,例如,我可以看到如果在表中指定belongs_to,那么rails会自动创建验证:validates :basket_id, presence: true代表Fruit

ruby-on-rails activerecord
2个回答
0
投票

如果您查看source code当属,实际上是引用的别名。

在Rails 5中,每当我们定义一个Emirates_to关联时,默认情况下都需要显示关联记录。尽管有一些方法可以关闭此功能。

要为特定的关联关闭此行为:

belongs_to :user, optional: true

要关闭整个应用程序:

Rails.application.config.active_record.belongs_to_required_by_default = false

可以在application.rb文件中添加。

您可以阅读此article以更好地理解。

例如,即使在Rails 4中,即使将t.belongs_to添加到模型验证,默认情况下也不存在。您需要添加有:

belongs_to :user, required: true

[belongs_toreferences在这里用于外键约束,而数据库完整性不用于模型验证。


0
投票

如果要在has_many的表/迁移中创建belongs_tobelongs_to关联,则确实需要以某种方式告诉它存储has_many ID。

在您的示例中,在水果表/迁移中,您必须告诉它您需要basket_id。有几种方法可以做到这一点。您已经发现了其中两个:

t.integer :basket_id
t.belongs_to :basket_id

还有第三种方式:

t.references :basket

他们几乎都做同样的事情。只要您在Fruits表/迁移中具有basket_id,就可以了。

如果迁移尚未完成,您可能想做的另一件事是添加一个foreign_ke。您可以通过添加foreign_key: true

来完成此操作
t.references :basket, foreign_key: true

这将告诉水果表basket_id是foreign_key,本质上是另一个表(篮子表)的键。

© www.soinside.com 2019 - 2024. All rights reserved.