[ruby-on-rails] Rails has_and_belongs_to_many 마이그레이션

두 가지 모델이 restaurant있고 userhas_and_belongs_to_many 관계를 수행하고 싶습니다.

이미 모델 파일로 이동하여 has_and_belongs_to_many :restaurantshas_and_belongs_to_many :users

이 시점에서 Rails 3과 같은 작업을 할 수 있어야한다고 가정합니다.

rails generate migration ....

그러나 내가 시도한 모든 것이 실패한 것 같습니다. 저는 이것이 정말 간단한 일이라고 확신합니다. 저는 rails를 처음 접하기 때문에 여전히 배우고 있습니다.



답변

restaurant_iduser_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

이 관계 레일 가이드 자습서를 확인해야합니다.


답변