生成迁移 - 创建连接表

got*_*tqn 65 migration ruby-on-rails jointable ruby-on-rails-3 ruby-on-rails-4

我已经浏览了许多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 
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉如何在两个表之间创建连接表迁移吗?

and*_*ham 157

要在命令行中自动填充create_join_table命令,它应如下所示:

rails g migration CreateJoinTableProductsSuppliers products suppliers
Run Code Online (Sandbox Code Playgroud)

对于产品型号和供应商型号.Rails将创建一个名为"products_suppliers"的表.注意复数.

(注意,generation命令可以简化为g)

  • 使联合表看起来更有意义:`rails g migration CreateJoinTableProductsSuppliers产品供应商` (46认同)
  • 使用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,但在迁移http://guides.rubyonrails.org/migrations.html中添加`table_name :: my_products_suppliers` (8认同)
  • 我比接受的答案更喜欢这个解决方案 (4认同)
  • @andrewcockerham这不适用于rails 3.2 (2认同)

Pow*_*ers 37

运行此命令以生成空迁移文件(它不会自动填充,您需要自己填充):

rails generate migration assignments_security_users
Run Code Online (Sandbox Code Playgroud)

打开生成的迁移文件并添加以下代码:

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
Run Code Online (Sandbox Code Playgroud)

然后rake db:migrate从您的终端运行.我创建了一个关于many_to_many关系的测验,其中有一个可能对您有帮助的简单示例.

  • 如果你这样做,请确保在字段定义中添加```null:false```.例如:```t.integer:assignment_id,null:false```.这将防止可怕的情况,你最终得到一个无处的连接表,你的数据会失去完整性,你的代码就会崩溃.(或者最终充斥着丑陋且容易出错的守卫代码). (4认同)

Pra*_*man 23

我通常喜欢在创建连接表时使用"模型"文件.所以我这样做.

rails g model AssignmentSecurityUser assignments_security:references user:references
Run Code Online (Sandbox Code Playgroud)