我不知道我的迁移有什么问题,但是它们不起作用,尝试在类别20180724203015\u create\u categories.rb中的主键的产品上添加外键
class CreateCategories < ActiveRecord::Migration[5.2]
def change
create_table :categories, id: false do |t|
t.string :name
t.text :description
t.integer :category_id, primary_key: true, auto_increment: true
t.timestamps
end
end
end
20180724203105\创建\产品.rb
class CreateProducts < ActiveRecord::Migration[5.2]
def change
create_table :products do |t|
t.string :name
t.references :category_id, foreign_key: true, index: true
t.timestamps
end
end
end
但是,这总是以错误结束,不能添加外键约束
2条答案
按热度按时间dzhpxtsq1#
rubyonrails支持约定优先于配置的原则。这意味着如果您遵循rails惯例,事情将变得更简单,几乎不需要配置。
在迁移过程中,您决定与rails的一个约定作斗争:数据库的主键存储在
id
列。当你决定不遵守这个约定时,你就不能简单地使用references
方法,而不告诉rails如何设置数据库。我的建议是:除非你有非常非常好的理由,否则不要反对rails惯例。它不仅会使这个任务(数据库迁移)变得更复杂,而且还会增加一些其他任务需要更多配置(例如activerecord模型)的风险,或者当您将rails更新到一个新版本时,gems可能会出现问题。
也就是说:更改迁移以使用rails约定:
nxagd54h2#
解决方法是删除t.integer:category\u id,并依赖于rails:id列。对于每个表,可以使用@category或@product进行引用,如注解中所述-@category=category.find(params[:id])或category.find(params[:category\u id]),因为我认为这是在routes中引用它的方式。谢谢您。