Rails迁移has_and_belongs_to_many连接表

我如何做一个script/generate migration来创buildhas_and_belongs_to_many关系的连接表?

该应用程序在Rails 2.3.2上运行,但我也安装了Rails 3.0.3。

哪里:

 class Teacher < ActiveRecord::Base has_and_belongs_to_many :students end 

 class Student < ActiveRecord::Base has_and_belongs_to_many :teachers end 

对于导轨4:

 rails generate migration CreateJoinTableStudentTeacher student teacher 

对于导轨3:

 rails generate migration students_teachers student_id:integer teacher_id:integer 

对于轨道<3

 script/generate migration students_teachers student_id:integer teacher_id:integer 

(注意,表名按字母顺序列出了两个连接表)

然后对于rails 3及其以下版本,则需要编辑生成的迁移,以便不创buildid字段:

 create_table :students_teachers, :id => false do |t| 

has_and_belongs_to_many表必须与此格式匹配。 我假设has_and_belongs_to_manyjoin的两个模型已经在数据库中: applesoranges

 create_table :apples_oranges, :id => false do |t| t.references :apple, :null => false t.references :orange, :null => false end # Adding the index can massively speed up join tables. Don't use the # unique if you allow duplicates. add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true) 

如果你在索引上使用:unique => true ,那么你应该(在rails3中)传递:uniq => true以便has_and_belongs_to_many

更多信息: Rails文档

UPDATED 2010-12-13我已经更新,以删除身份证和时间戳…基本上MattDiPasqualenunopolonia是正确的:不能有一个ID,一定不能有时间戳或轨道不会让has_and_belongs_to_many工作。

您应该按照字母顺序为要连接的2个模型的名称命名,并将两个模型ID放在表中。 然后将每个模型相互连接,在模型中创build关联。

这是一个例子:

 # in migration def self.up create_table 'categories_products', :id => false do |t| t.column :category_id, :integer t.column :product_id, :integer end end # models/product.rb has_and_belongs_to_many :categories # models/category.rb has_and_belongs_to_many :products 

但是这不是很灵活,你应该考虑使用has_many:through

最上面的答案显示了一个综合指数,我不相信会用来从橙子中查找苹果。

 create_table :apples_oranges, :id => false do |t| t.references :apple, :null => false t.references :orange, :null => false end # Adding the index can massively speed up join tables. # This enforces uniqueness and speeds up apple->oranges lookups. add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true) # This speeds up orange->apple lookups add_index(:apples_oranges, :orange_id) 

我确实find了这个答案,这个答案是基于“医生什么是有用的”,也是如此讨论。

在导轨4中,你可以简单的使用

create_join_table:table1s,:table2s

这就是全部。

小心:您必须取决于table1,table2和字母数字。

我喜欢做:

rails g migration CreateJoinedTable model1:references model2:references 。 这样我得到一个像这样的迁移:

 class CreateJoinedTable < ActiveRecord::Migration def change create_table :joined_tables do |t| t.references :trip, index: true t.references :category, index: true end add_foreign_key :joined_tables, :trips add_foreign_key :joined_tables, :categories end end 

我喜欢在这些列上进行索引,因为我经常使用这些列进行查找。