Как работает драгоценный камень иностранца?
Я смотрю на жемчужину иностранца и пытаюсь создать несколько внешних ключей. Тем не менее, в документации по 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, так что, надеюсь, он исправит документацию.