Answers:
哪里:
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和更低版本,您需要编辑生成的迁移,因此不会创建id字段:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
而不是rails generate migration CreateJoinTableStudentTeacher student teacher
,是否一样?S(学生)需要在T(每个)之前吗?
一个has_and_belongs_to_many
表必须格式相匹配。我假定这两个模型由被连接has_and_belongs_to_many
已经在DB:apples
和oranges
:
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 Docs
更新2010-12-13我已经对其进行了更新,以删除ID和时间戳...基本上MattDiPasquale
且nunopolonia
正确的是:不能有ID,也不能有时间戳,否则Rails将无法has_and_belongs_to_many
工作。
script/generate migration
...
您应按字母顺序为表命名要连接的2个模型的名称,并将两个模型ID放在表中。然后将每个模型彼此连接,在模型中创建关联。
这是一个例子:
# 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)
我确实发现基于“ What Doctor”的答案很有用,而且讨论当然也是如此。
在rails 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
我喜欢在这些列上建立索引,因为我经常会使用这些列进行查找。
add_foreign_key
如果放置在与创建表相同的迁移中,将失败。