外国人宝石如何运作?

时间:2013-03-23 01:57:38

标签: ruby-on-rails foreign-keys foreigner

我正在看外国人的宝石并尝试创建一些外键。但是,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

有人可以向我解释这里发生的事情吗?为什么我会出现阅读障碍?

1 个答案:

答案 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上报告了这个问题,所以希望他能修复文档。