복붙노트

[RUBY-ON-RAILS] 레일의 많은 관계로 많은 만들기

RUBY-ON-RAILS

레일의 많은 관계로 많은 만들기

이것은 내가 달성하기 위해 노력하고 무엇을 간단하게 예를 들어, 내가 레일에 비교적 새로운 해요 및 모델 사이의 관계를 주위에 내 머리를 얻기 위해 고군분투하고있다.

나는 두 가지 모델, 사용자 모델과 종류의 모델이있다. 사용자는 여러 범주와 연관 될 수 있습니다. 특정 카테고리는 많은 사용자 범주 목록에 표시 할 수 있습니다. 특정 카테고리가 삭제되면, 이것은 사용자에 대한 카테고리 목록에 반영되어야한다.

이 예에서 :

내 카테고리 테이블은 다섯 개 가지 범주를 포함 :

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| ID | Name                       |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 1  | Sports                     | 
| 2  | News                       |
| 3  | Entertainment              |
| 4  | Technology                 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

내 사용자 테이블은 두 명의 사용자가 포함되어 있습니다

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| ID | Name                       |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 1  | UserA                      | 
| 2  | UserB                      |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

나는 범주와 사용자 모두의 ID를 보유하고 UserCategories 테이블을 생성하여 주위 놀다했습니다. 일의이 종류는, 내가 범주 이름을 찾아 볼 수 있지만, 난 그냥 잘못된 듯 계단식 작업 및 전체 솔루션을 삭제할 수 없습니다.

내가 찾은하는 belongs_to와 has_many 기능을 사용하는 예는 일대일 관계를 매핑 논의 할 것으로 보인다. 예를 들어, 블로그 게시물에 코멘트.

해결법

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

    1.당신은 has_and_belongs_to_many 관계를 원한다. 가이드는 차트 및 모든과 방법이 작품을 설명하는 훌륭한 일을 수행합니다

    당신은 has_and_belongs_to_many 관계를 원한다. 가이드는 차트 및 모든과 방법이 작품을 설명하는 훌륭한 일을 수행합니다

    http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

    이 같은 끝낼 것입니다 :

    # app/models/category.rb
    class Category < ActiveRecord::Base
      has_and_belongs_to_many :users
    end
    
    # app/models/user.rb
    class User < ActiveRecord::Base
      has_and_belongs_to_many :categories
    end
    

    이제 당신은 사용에 레일을 위해 테이블을 조인 작성해야합니다. 레일 당신을 위해 자동으로 수행되지 않습니다. 이것은 효과적으로 범주 및 사용자의 각각에 대한 참조없이 기본 키가있는 테이블이다.

    이 같은 CLI에서 마이그레이션을 생성합니다 :

    bin/rails g migration CreateCategoriesUsersJoinTable
    

    그런 다음를 열고 편집이 일치 :

    def change
      # This is enough; you don't need to worry about order
      create_join_table :categories, :users
    
      # If you want to add an index for faster querying through this join:
      create_join_table :categories, :users do |t|
        t.index :category_id
        t.index :user_id
      end
    end
    
    def self.up
      # Model names in alphabetical order (e.g. a_b)
      create_table :categories_users, :id => false do |t|
        t.integer :category_id
        t.integer :user_id
      end
    
      add_index :categories_users, [:category_id, :user_id]
    end
    
    def self.down
      drop_table :categories_users
    end
    

    장소에두고, 당신의 마이그레이션을 실행하고 당신은 당신이 사용하고있는 편리한 접근 모두와 함께 카테고리와 사용자를 연결할 수 있습니다 :

    User.categories  #=> [<Category @name="Sports">, ...]
    Category.users   #=> [<User @name="UserA">, ...]
    User.categories.empty?
    
  2. ==============================

    2.가장 인기있는 '모노 전이 협회는'당신은이 작업을 수행 할 수 있습니다 :

    가장 인기있는 '모노 전이 협회는'당신은이 작업을 수행 할 수 있습니다 :

    class Book < ApplicationRecord
      has_many :book_author
      has_many :author, through: :book_author
    end
    
    # in between
    class BookAuthor < ApplicationRecord
      belongs_to :book
      belongs_to :author
    end
    
    class Author < ApplicationRecord
      has_many :book_author
      has_many :book, through: :book_author
    end
    
  3. ==============================

    3.그냥 coreyward의 답변을보다 보완 : 당신은 이미 belongs_to, has_many 관계가있는 모델을 가지고 당신은 당신이 필요합니다 동일한 테이블을 사용하여 새 관계 has_and_belongs_to_many을 만들려면 :

    그냥 coreyward의 답변을보다 보완 : 당신은 이미 belongs_to, has_many 관계가있는 모델을 가지고 당신은 당신이 필요합니다 동일한 테이블을 사용하여 새 관계 has_and_belongs_to_many을 만들려면 :

    rails g migration CreateJoinTableUsersCategories users categories
    

    그때,

    rake db:migrate
    

    그 후, 당신은 당신의 관계를 정의해야합니다 :

    User.rb :

    class Region < ApplicationRecord
      has_and_belongs_to_many :categories
    end
    

    Category.rb

    class Facility < ApplicationRecord
      has_and_belongs_to_many :users
    end
    

    새로운 오래된 데이터를 테이블에 가입 채울하기 위해, 당신은 당신의 콘솔에 필요합니다 :

    User.all.find_each do |u|
      Category.where(user_id: u.id).find_each do |c|
        u.categories <<  c
      end
    end
    

    당신은 어느 종류와 사용자 테이블의 USER_ID 컬럼 및 CATEGORY_ID 열을 떠나거나 삭제하는 마이그레이션을 생성 할 수 있습니다.

  4. from https://stackoverflow.com/questions/5120703/creating-a-many-to-many-relationship-in-rails by cc-by-sa and MIT license