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