Rails5添加引用创建一对多
Rails5 add references to create one to many
我创建了两个模型调用 Restaurant
和 menu
,以及餐厅 has_many 菜单。
我通过输入
创建菜单
rails g model Menu name restaurant:references
但我发现我无法按类型创建菜单 Menu.create(name: "test1")
m1 = Menu.create(name: "test1")
(0.2ms) BEGIN
(0.2ms) ROLLBACK
=> #<Menu id: nil, name: "test1", restaurant_id: nil, created_at: nil, updated_at: nil>
然后我检查了 migration
和 schema
,在 Rails5 迁移中 references
变成了这个
#Menu migration
...
t.references :restaurant, foreign_key: true
我认为在 Rails4 中,它会像
t.references :restaurant, index: true
这是我无法创建 meun 的原因吗?
更新
这是迁移文件
class CreateMenus < ActiveRecord::Migration[5.0]
def change
create_table :menus do |t|
t.string :name
t.references :restaurant, foreign_key: true
t.timestamps
end
end
end
您无法创建菜单,因为您的迁移包含 restaurant_id
上的外键约束,这意味着没有餐厅就无法创建菜单(类似地,如果相关联的菜单无法销毁餐厅存在)。如果这是您的意图,您需要在创建菜单时提供有效的 restaurant_id
或通过 restaurant
上的关联创建菜单
@restaurant.menus.create(name: 'test1')
如果不需要外键约束,修改迁移,去掉:foreign_key
选项。如果这样做,请将 :index
选项设置为 true。
我创建了两个模型调用 Restaurant
和 menu
,以及餐厅 has_many 菜单。
我通过输入
rails g model Menu name restaurant:references
但我发现我无法按类型创建菜单 Menu.create(name: "test1")
m1 = Menu.create(name: "test1")
(0.2ms) BEGIN
(0.2ms) ROLLBACK
=> #<Menu id: nil, name: "test1", restaurant_id: nil, created_at: nil, updated_at: nil>
然后我检查了 migration
和 schema
,在 Rails5 迁移中 references
变成了这个
#Menu migration
...
t.references :restaurant, foreign_key: true
我认为在 Rails4 中,它会像
t.references :restaurant, index: true
这是我无法创建 meun 的原因吗?
更新
这是迁移文件
class CreateMenus < ActiveRecord::Migration[5.0]
def change
create_table :menus do |t|
t.string :name
t.references :restaurant, foreign_key: true
t.timestamps
end
end
end
您无法创建菜单,因为您的迁移包含 restaurant_id
上的外键约束,这意味着没有餐厅就无法创建菜单(类似地,如果相关联的菜单无法销毁餐厅存在)。如果这是您的意图,您需要在创建菜单时提供有效的 restaurant_id
或通过 restaurant
@restaurant.menus.create(name: 'test1')
如果不需要外键约束,修改迁移,去掉:foreign_key
选项。如果这样做,请将 :index
选项设置为 true。