1

私は外国人の宝石を見て、いくつかの外部キーを作成しようとしています。ただし、宝石のドキュメントには、この `add_foreign_key(from_table, to_table, options) のように外部キーを作成する必要があると書かれていますが、それを行うと、逆に機能するようです。たとえば、Entry、Ingredient、および EntryIngredient という 3 つのモデルがあります。Entry は EntryIngredient を通じて多数の Ingredient を持ち、Ingredient は EntryIngredients を通じて多数の Entries を持ち、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 します

ドキュメントのロジックでは、このコード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 に答える