복붙노트

[RUBY-ON-RAILS] 때 하나는 "has_many을 :을 통해"사용해야 레일의 관계?

RUBY-ON-RAILS

때 하나는 "has_many을 :을 통해"사용해야 레일의 관계?

때 (방법)을 사용하는 방법을 통해이며 : 나는 무엇을 has_many을 이해하려고 노력하고 있습니다. 그러나, 나는 그것을 받고 있지 않다. 나는 레일 3부터 읽기 그리고 난 인터넷 검색을 시도하지만, 나는 이해할 수 없습니다입니다.

해결법

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

    1.사용자 및 그룹 : 두 개의 모델을 가지고 말.

    사용자 및 그룹 : 두 개의 모델을 가지고 말.

    당신이 그룹에 속한 사용자를하고 싶었 경우에, 당신이 뭔가를 할 수 있습니다 :

    class Group < ActiveRecord::Base
      has_many :users
    end
    
    class User < ActiveRecord::Base
      belongs_to :group
    end
    

    당신이 협회의 주위에 추가 메타 데이터를 추적하고 싶다면? 예를 들어, 사용자는 사용자의 역할은 그룹에 어떤 아마도 그룹에 합류, 또는?

    이 협회 첫 번째 클래스 개체 수 있도록하는 곳이다 :

    class GroupMembership < ActiveRecord::Base
      belongs_to :user
      belongs_to :group
    
      # has attributes for date_joined and role
    end
    

    이 소개하는 새 테이블, 및을 제거해 사용자의 테이블에서 GROUP_ID 열입니다.

    이 코드의 문제는 당신이 사용자 클래스를 사용하는 경우 다른 모든를 업데이트하고 변경해야 할 것이다 :

    user.groups.first.name
    
    # becomes
    
    user.group_memberships.first.group.name
    

    코드의이 유형은 짜증, 그리고이 고통과 같은 변화를 소개합니다.

    has_many : 당신에게 두 세계의 최고 제공을 통해 :

    class User < ActiveRecord::Base
      has_many :groups, :through => :group_memberships  # Edit :needs to be plural same as the has_many relationship   
      has_many :group_memberships
    end
    

    이제 일반 has_many처럼 취급하지만, 당신이 그것을 필요로 할 때 협회 모델의 혜택을받을 수 있습니다.

    당신은 또한 has_one하여이 작업을 수행 할 수 있습니다.

    편집 : 그룹에 사용자를 쉽게 추가 할 수 그것을 만들기

    def add_group(group, role = "member")
      self.group_associations.build(:group => group, :role => role)
    end
    
  2. ==============================

    2.당신이이 모델을 가지고 말 :

    당신이이 모델을 가지고 말 :

    Car
    Engine
    Piston
    

    자동차 has_one : 엔진 자동차 : belongs_to 엔진 엔진의 has_many : 피스톤 피스톤 belongs_to : 엔진

    자동차의 has_many : 통해 피스톤 : 엔진 피스톤 has_one : 자동차를 통해 : 엔진

    본질적으로 다른 모델로 모델 관계를 위임, 그래서 대신 호출 car.engine.pistons에 데, 당신은 car.pistons은 다만 수

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

    3.has_many : 관통하고 다른 테이블 간의 관계를 나타내는 표이다 중간 테이블을 통해 가입 has_and_belongs_to_many 관계 기능. A는 쿼리를 가입 달리, 데이터는 실제로 테이블에 저장됩니다.

    has_many : 관통하고 다른 테이블 간의 관계를 나타내는 표이다 중간 테이블을 통해 가입 has_and_belongs_to_many 관계 기능. A는 쿼리를 가입 달리, 데이터는 실제로 테이블에 저장됩니다.

    has_and_belongs_to_many를 사용하면 기본 키를 필요로하지 않으며, 당신은 액티브 관계를 통해보다는 액티브 모델을 통해 레코드를 액세스 할 수 있습니다. 당신은 다 대다 관계를 두 가지 모델을 링크 할 때 일반적으로 HABTM를 사용합니다.

    당신은 has_many을 사용 관계를 통해 당신이 차 키와 조인 된 데이터에 사용자 지정 열을 추가 할 수있는 기능을 완비 한 레일 모델로 테이블을 결합과 상호 작용 할 때. 후자는 접합 행 관련된 데이터에 특히 중요하지만, 종래의 모델에 속하는 정말로하지 않는다 - 예를 들면, 접합 행의 필드로부터 도출 된 계산 값을 저장하는 단계를 포함한다.

    액티브 레코드 협회에 가이드에서 추천 읽습니다

  4. from https://stackoverflow.com/questions/11600928/when-should-one-use-a-has-many-through-relation-in-rails by cc-by-sa and MIT license