2010-12-02 77 views
25

我想知道「正確」的方式來處理Rails中加入3添加模型參考現有的Rails的模型

鑑於現有模型兩種現有類之間的關係:小丑&兔

我想添加一個從兔子到小丑的參考(belongs_to)。我開始試圖通過生成一個遷移:

rails g migration AddClownToRabbits clown:reference 

,給了我一個遷移,看起來像:

class AddClownToRabbits < ActiveRecord::Migration 
    def self.up 
    add_column :rabbits, :clown, :reference 
    end 

    def self.down 
    remove_column :rabbits, :clown 
    end 
end 

rake db:migrate在該次遷移後我檢查的SQLite3的development.db,看到一個新列:"clown" reference

我猜我期待一個"clown_id" integer列,看起來像一個遷移:

class AddClownToRabbits < ActiveRecord::Migration 
    def self.up 
    add_column :rabbits, :clown_id 
    end 

    def self.down 
    remove_column :rabbits, :clown_id 
    end 
end 

我確定:引用應該等同於「t.references:clown」,但我找不到文檔(大驚喜)。 API說add_column:Instantiates a new column for the table. The type parameter is normally one of the migrations native types, which is one of the following: :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.

...沒有參考到:參考。

+1

有關文檔(以及它在文檔中的引用,請參閱http://guides.rubyonrails.org/getting_started.html),然後向下滾動到7.1生成模型並查看該標題下的代碼段。你會看到它是*:引用*而不是*:引用*。 – iconoclast 2011-04-15 02:38:32

回答

18

當您在小丑設置在兔belongs_to的,和的has_many,你可以做一個遷移:

add_column :rabbit, :clown_id, :integer 
+0

太棒了!謝謝!我有點期待......但仍然在努力將這個......放在「裸體」遷移中?所以也許只是'軌道g遷移AddClownToRabbits`,然後手動編輯休息? – Meltemi 2010-12-02 19:48:40

5

我不確定你在哪裏得到了這個想法,但是沒有(並且從來沒有)這樣的語法去做你想要的東西add_column。如你所說,爲了得到你想要的行爲,你必須做t.refences :clown。在後臺這將調用:@base.add_column(@table_name, "#{col}_id", :integer, options)

請參閱here

編輯:

我想我可以看到你的困惑的來源。您看到方法調用t.reference,並認爲它是一種數據類型,因爲存在諸如t.integert.string之類的調用,並且這些調用是數據類型。這是錯誤的。引用不是數據類型,它只是一個方法的名稱,類似於t.rename

+0

對於混淆感到抱歉......學習......以及,這是你學習的方式。謝謝!所以,爲了回答我的問題,什麼是適當的生成器命令...仍然假設我需要從一個開始,因爲生成器有時間戳,我認爲我不應該手動創建文件名?!? `rails g migration AddClownToRabbits clown:reference`給了我上面的壞垃圾。 – Meltemi 2010-12-02 19:46:01

+0

@Meltemi:沒有生成器添加引用的命令,只有列。請記住,所有的發電機確實是..很好。生成。這不是一個大問題,它不能添加引用,你只需自己做。 – ryeguy 2010-12-02 22:37:50

52

如果您使用的邊緣導軌(4.0),可以使用:

rails generate migration AddAddressRefToContacts address:references 

正如你所看到的docs