Как мне сделать script/generate migration
для создания таблицы соединений для отношения has_and_belongs_to_many
?
Приложение работает на Rails 2.3.2, но у меня также установлен Rails 3.0.3.
Как мне сделать script/generate migration
для создания таблицы соединений для отношения has_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
(обратите внимание, что в названии таблицы перечислены обе таблицы соединений в алфавитном порядке)
а затем только для рельсов 3 и ниже, вам нужно отредактировать сгенерированную миграцию, чтобы поле id не было создано:
create_table :students_teachers, :id => false do |t|
A has_and_belongs_to_many
таблица должна соответствовать этому формату. Я предполагаю, что две модели, которые будут объединены has_and_belongs_to_many
, уже находятся в БД: 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. Я обновил его, чтобы удалить идентификаторы и отметки времени... В основном MattDiPasquale
и nunopolonia
верны: не должно быть идентификатора, и необходимо а не временные метки или рельсы не разрешат has_and_belongs_to_many
работать.
Вы должны назвать таблицу именами двух моделей, которые вы хотите подключить, в алфавитном порядке и поместите два идентификатора модели в таблицу. Затем подключите каждую модель друг к другу, создав ассоциации в модели.
Вот пример:
# 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: через
В верхнем ответе показан составной индекс, который, как я полагаю, не будет использоваться для поиска яблок из апельсинов.
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)
Я нашел ответ, основанный на "Докторе", который полезен, и обсуждение, конечно же, тоже.
В рельсах 4 вы можете просто использовать
create_join_table: table1s,: table2s
это все.
Предостережение: вы должны отключить таблицу1, 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
Мне нравится иметь индекс для этих столбцов, потому что я часто делаю поиск с использованием этих столбцов.