development

Rails has_and_belongs_to_many 마이그레이션

big-blog 2020. 7. 25. 10:15
반응형

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 ....

그러나 내가 시도한 모든 것이 실패한 것 같습니다. 나는 이것이 레일에 익숙하지 않은 정말 간단한 것이므로 여전히 배우고 있습니다.


알파벳 순서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

If you want to index these columns, uncomment the respective lines and you're good to go!


When creating the join table, pay careful attention to the requirement that the two tables need to be listed in alphabetical order in the migration name/class. This can easily bite you if your model names are similar, e.g. "abc" and "abb". If you were to run

rails g migration create_abc_abb_table

Your relations will not work as expected. You must use

rails g migration create_abb_abc_table

instead.


For HABTM relationships, you need to create a join table. There is only join table and that table should not have an id column. Try this migration.

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

You must check this relationship rails guide tutorials

참고URL : https://stackoverflow.com/questions/6561330/rails-has-and-belongs-to-many-migration

반응형