1

我正在查看外国人宝石并尝试创建一些外键。但是,gems文档说您应该像这样创建外键 `add_foreign_key(from_table, to_table, options) 但是当我这样做时,它似乎向后工作。例如,我有 3 个模型,Entry、Ingredient 和一个名为 EntryIngredient 的关联。Entry通过EntryIngredient有很多的Ingredient,通过EntryIngredients有很多Entry,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

有人可以向我解释这里发生了什么吗?为什么我有阅读障碍?

4

1 回答 1

1

我已经验证了这一点,如果有人认为我仍然没有得到它,请向我解释。但是,除非我的英语不好,否则我认为 gem 的文档记录不正确。正确的语法实际上是:

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 上将此问题报告为问题,因此希望他修复文档。

于 2013-03-24T23:24:58.653 回答