46

我已經瀏覽了很多SOgoogle職位用於生成遷移連接表has many and belongs to many關聯並且沒有任何工作。生成遷移 - 創建連接表

所有的解決方案都生成一個空的遷移文件。

我使用的是rails 3.2.13,我有兩個表格:security_usersassignments。這些都是一些事情我必須嘗試:

rails generate migration assignments_security_users 

rails generate migration create_assignments_security_users 

rails generate migration create_assignments_security_users_join_table 

rails g migration create_join_table :products, :categories (following the official documentation) 

rails generate migration security_users_assignments security_user:belongs_to assignments:belongs_to 

誰能告訴如何將兩個表之間創建一個連接表遷移?

回答

33

運行此命令生成空遷移文件(它不會自動填充,你需要自己填寫吧):

rails generate migration assignments_security_users 

打開生成的遷移文件,並添加以下代碼:

class AssignmentsSecurityUsers < ActiveRecord::Migration 
    def change 
    create_table :assignments_security_users, :id => false do |t| 
     t.integer :assignment_id 
     t.integer :security_user_id 
    end 
    end 
end 

然後從您的終端運行rake db:migrate。我用一個簡單的例子創建了a quiz on many_to_many relationships,這個例子可以幫助你。

+2

如果你這樣做,確保你在字段定義中加入了null:false。例如:'''t.integer:assignment_id,null:false'''。這樣可以防止最終導致無法連接的連接表的惡劣情況,數據失去完整性並且代碼崩潰。 (或者最終會遇到醜陋和易出錯的守衛代碼)。 –

+0

我同意@Powers並會補充說,也許這是一個想法添加索引到這些列? – BKSpurgeon

115

讓系統自動在命令行中create_join_table命令,它應該是這樣的:

rails g migration CreateJoinTableProductsSuppliers products suppliers 

對於產品型號和供應商的模式。 Rails將創建一個名爲「products_suppliers」的表。注意複數。

(旁註是generation命令可以被簡寫爲g

+42

爲了使聯合表看起來更有意義:'使用CreateGoinTableProductsSuppliers產品供應商'CreateGoinTableProductsSuppliers產品供應商' – zishe

+7

請小心使用CreateJoinTable,因爲當處理帶有像my_products和my_suppliers這樣的前綴的表時,它將生成一個像這樣的連接表my_products_my_suppliers,而ActiveRecord期望它成爲my_products_suppliers。然後像MyProduct.first.my_suppliers這樣的關聯將不起作用!檢查https://github.com/rails/rails/issues/13683 - 我的解決方案是繼續使用CreateJoinTable,但在遷移中添加'table_name :: my_products_suppliers' http://guides.rubyonrails.org/migrations.html –

+0

@ andrewcockerham這不適用於rails 3.2 –

11

我通常喜歡「模型」的文件,以及當我創建的連接表。所以我這樣做。

rails g model AssignmentSecurityUser assignments_security:references user:references