2013-03-23 23 views
1

我在看外國人的寶石,並試圖創建一些外鍵。然而,寶石documentation說,你應該像`add_foreign_key(from_table,to_table,options)一樣創建你的外鍵,但是當我這樣做時,它看起來像是倒退了。例如,我有3個模型,Entry,Ingredient和一個名爲EntryIngredient的關聯。通過EntryIngredient進入許多成分,成分通過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

我驗證了這一點,如果有人認爲我還沒有得到它,請向我解釋。但是,除非我的英語不好,否則我認爲這個寶石記錄不正確。正確的語法居然是:

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上的問題,所以希望他修復的文檔。