복붙노트

[RUBY-ON-RAILS] has_and_belongs_to_many에 대한 마이그레이션을 레일 테이블 조인

RUBY-ON-RAILS

has_and_belongs_to_many에 대한 마이그레이션을 레일 테이블 조인

내가 스크립트를 어떻게해야합니까 / A는 has_and_belongs_to_many 관계를 테이블에 가입 만드는 마이그레이션을 생성?

응용 프로그램 레일 2.3.2에서 실행,하지만 나는 또한 레일 3.0.3가 설치되어 있습니다.

해결법

  1. ==============================

    1.어디:

    어디:

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

    2.has_and_belongs_to_many 테이블이 형식과 일치해야합니다. 나는 DB에서 이미 두 모델이 has_and_belongs_to_many에 합류 할 수있다 있으리라 믿고있어 : 사과와 오렌지 :

    has_and_belongs_to_many 테이블이 형식과 일치해야합니다. 나는 DB에서 이미 두 모델이 has_and_belongs_to_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. Don't use the
    # unique if you allow duplicates.
    add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
    

    당신이 사용하는 경우 : 인덱스에 고유 => 사실을, 당신은 (레일 3) 전달해야합니다 : has_and_belongs_to_many에 UNIQ는 => 사실.

    더 많은 정보 : 레일 문서

    나는 ID와 타임 스탬프를 제거하도록 업데이트되었습니다 2010-12-13 업데이트 ... 기본적으로 MattDiPasquale 및 nunopolonia가 올바른지 :의 ID가 없어야합니다 거기에 타임 스탬프해서는 안이나 레일 작업에 has_and_belongs_to_many을 허용하지 않습니다.

  3. ==============================

    3.당신은 당신이 알파벳 순서로 연결하려는 테이블 2 개 모델의 이름을 이름을 지정해야 테이블에서 두 모델의 id를 넣어. 그런 다음 모델의 연결을 만들어 서로 각 모델을 연결합니다.

    당신은 당신이 알파벳 순서로 연결하려는 테이블 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을 사용하는 방법에 대해 생각해야합니다 통해

  4. ==============================

    4.복합 인덱스 내가 생각하지 않는 것이 최고 응답 쇼는 오렌지에서 사과를 조회하는 데 사용됩니다.

    복합 인덱스 내가 생각하지 않는 것이 최고 응답 쇼는 오렌지에서 사과를 조회하는 데 사용됩니다.

    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)
    

    나는 확실히 너무 너무 '닥터 무엇 유용하고 토론하여이의 기반이 답을 발견했다.

  5. ==============================

    5.4 레일, 당신은 간단하게 사용을 할 수 있습니다

    4 레일, 당신은 간단하게 사용을 할 수 있습니다

    create_join_table : table1s : table2s

    그것이 전부입니다.

    주의 : 숫자와 당신이해야 offord 표 1, 표 2.

  6. ==============================

    6.나는 일을 좋아한다 :

    나는 일을 좋아한다 :

    레일 g 이주 CreateJoinedTable 모델 1 : 참조 모델 2 : 참조. 그런 식으로 나는 마이그레이션을 얻을 것을 다음과 같다 :

    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
    

    나는 종종 이러한 열을 사용하여 조회를하고있을 것이기 때문에 나는이 컬럼에 인덱스를 보내고 있습니다.

  7. from https://stackoverflow.com/questions/4381154/rails-migration-for-has-and-belongs-to-many-join-table by cc-by-sa and MIT license