我正在看外国人的宝石并尝试创建一些外键。但是,gems documentation表示你应该创建你的外键,例如`add_foreign_key(from_table,to_table,options),但是当我这样做时,它看起来像向后工作。例如,我有3个模型,Entry,Ingredient和一个名为EntryIngredient的关联。 Entry通过EntryIngredient有许多成分,Ingredient通过EntryIngredients有许多条目,EntryIngredient属于这两个。然而,这是有效的代码:
class EntryIngredient < ActiveRecord::Base
belongs_to :entry
belongs_to :ingredient
end
class CreateEntryIngredients < ActiveRecord::Migration
def self.up
create_table :entry_ingredients do |t|
t.references :entry
t.references :ingredient
t.integer :quantity
t.string :unit
t.timestamps
end
add_index :entry_ingredients, [:entry_id, :ingredient_id]
add_foreign_key :entry_ingredients, :entries, :dependent => :delete
add_foreign_key :entry_ingredients, :ingredients, :dependent => :delete
end
def self.down
drop_table :entry_ingredients
end
end
通过文档,我认为实际上应该像这样添加外键:
add_foreign_key :entries, :entry_ingredients, :dependent => :delete
add_foreign_key :ingredients, :entry_ingredients, :dependent => :delete
但是当我运行迁移时,会返回一个
Mysql2::Error: Key column 'entry_ingredient_id' doesn't exist in table: ALTER TABLE `entries` ADD CONSTRAINT `entries_entry_ingredient_id_fk` FOREIGN KEY (`entry_ingredient_id`) REFERENCES `entry_ingredient`(id) ON DELETE CASCADE
有人可以向我解释这里发生的事情吗?为什么我会出现阅读障碍?
答案 0 :(得分:1)
我已经验证了这一点,如果有人认为我还没有得到它,请向我解释。但是,除非我的英语不好,否则我认为宝石的记录不正确。实际上语法是正确的:
add_foreign_key(to_table, from_table, options)
所以我会做add_foreign_key :entry_ingredients, :entries, :dependent => :delete
这个逻辑告诉我,从表条目中添加一个外键到entry_ingredients,作为entry_id,带有选项...
虽然通过文档逻辑,我会使用这个代码add_foreign_key :entries, :entry_ingredients, :dependent => :delete
,它对我说,从条目(作为entry_id)添加一个外键到entry_ingredients,带有选项......然而,实际上发生的是我们从entry_ingredients(作为entry_ingredients_id)向条目添加外键。这是错误的,而不是预期的结果。以下是我按照文档方法证明它时收到的错误:
Mysql2::Error: Key column 'entry_ingredient_id' doesn't exist in table: ALTER TABLE `entries` ADD CONSTRAINT `entries_entry_ingredient_id_fk` FOREIGN KEY (`entry_ingredient_id`) REFERENCES `entry_ingredients`(id) ON DELETE CASCADE
我已经在github上报告了这个问题,所以希望他能修复文档。