Как работает драгоценный камень иностранца?

Я смотрю на жемчужину иностранца и пытаюсь создать несколько внешних ключей. Тем не менее, в документации по gems говорится, что вы должны создавать свои внешние ключи, такие как `add_foreign_key(from_table, to_table, options), но когда я делаю это, кажется, что это работает в обратном направлении. Например, у меня есть 3 модели: Entry, Ingredient и ассоциация EntryIngredient. У Entry есть много Ingredients через EntryIngredient, у Ingredient есть много Entries через EntryIngredient, и 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 ответ

Решение

Я подтвердил это, если кто-то думает, что я все еще не понимаю, пожалуйста, объясните мне. Но, если мой английский не плох, я считаю, что камень задокументирован неправильно. Правильный синтаксис на самом деле:

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, так что, надеюсь, он исправит документацию.

Другие вопросы по тегам