두 가지 모델이 restaurant
있고 user
has_and_belongs_to_many 관계를 수행하고 싶습니다.
이미 모델 파일로 이동하여 has_and_belongs_to_many :restaurants
및has_and_belongs_to_many :users
이 시점에서 Rails 3과 같은 작업을 할 수 있어야한다고 가정합니다.
rails generate migration ....
그러나 내가 시도한 모든 것이 실패한 것 같습니다. 저는 이것이 정말 간단한 일이라고 확신합니다. 저는 rails를 처음 접하기 때문에 여전히 배우고 있습니다.
답변
restaurant_id
및 user_id
(기본 키 없음) 만있는 별도의 조인 테이블을 알파벳 순서 로 추가해야합니다 .
먼저 마이그레이션을 실행 한 다음 생성 된 마이그레이션 파일을 편집하십시오.
레일즈 3
rails g migration create_restaurants_users_table
레일스 4 :
rails g migration create_restaurants_users
레일즈 5
rails g migration CreateJoinTableRestaurantUser restaurants users
로부터 문서 :
JoinTable이 이름의 일부인 경우 조인 테이블을 생성하는 생성기도 있습니다.
마이그레이션 파일 (참고 :id => false
: 기본 키 생성을 방지합니다) :
레일즈 3
class CreateRestaurantsUsers < ActiveRecord::Migration
def self.up
create_table :restaurants_users, :id => false do |t|
t.references :restaurant
t.references :user
end
add_index :restaurants_users, [:restaurant_id, :user_id]
add_index :restaurants_users, :user_id
end
def self.down
drop_table :restaurants_users
end
end
레일스 4
class CreateRestaurantsUsers < ActiveRecord::Migration
def change
create_table :restaurants_users, id: false do |t|
t.belongs_to :restaurant
t.belongs_to :user
end
end
end
t.belongs_to
필요한 인덱스가 자동으로 생성됩니다. def change
앞으로 또는 롤백 마이그레이션을 자동으로 감지하므로 업 / 다운이 필요하지 않습니다.
레일즈 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
참고 :라는 create_join_table에 매개 변수로 전달할 수있는 사용자 정의 테이블 이름에 대한 옵션도 있습니다 table_name
. 로부터 문서
기본적으로 조인 테이블의 이름은 알파벳 순서로 create_join_table에 제공된 처음 두 인수의 합집합에서 가져옵니다. 테이블 이름을 사용자 정의하려면 : table_name 옵션을 제공하십시오.
답변
여기에 대한 답변은 상당히 오래되었습니다. Rails 4.0.2부터 마이그레이션은 create_join_table
.
마이그레이션을 작성하려면 다음을 실행하십시오.
rails g migration CreateJoinTableRestaurantsUsers restaurant user
그러면 다음이 생성됩니다.
class CreateJoinTableRestaurantsUsers < ActiveRecord::Migration
def change
create_join_table :restaurants, :users do |t|
# t.index [:restaurant_id, :user_id]
# t.index [:user_id, :restaurant_id]
end
end
end
이러한 열을 인덱싱하려면 각 줄의 주석 처리를 제거하면됩니다.
답변
조인 테이블을 생성 할 때 마이그레이션 이름 / 클래스에서 두 테이블을 알파벳 순서 로 나열해야한다는 요구 사항에주의하십시오 . 예를 들어 “abc”및 “abb”와 같이 모델 이름이 비슷하면 쉽게 물릴 수 있습니다. 실행한다면
rails g migration create_abc_abb_table
당신의 관계는 예상대로 작동 하지 않을 것입니다. 당신은 사용해야합니다
rails g migration create_abb_abc_table
대신.
답변
HABTM 관계의 경우 조인 테이블을 만들어야합니다. 조인 테이블 만 있으며 해당 테이블에는 ID 열이 없어야합니다. 이 마이그레이션을 시도하십시오.
def self.up
create_table :restaurants_users, :id => false do |t|
t.integer :restaurant_id
t.integer :user_id
end
end
def self.down
drop_table :restaurants_users
end
이 관계 레일 가이드 자습서를 확인해야합니다.