52

레일즈는 has_one :through 연관성을 가지고있어 두 번째 모델을 통해 세 번째 모델과 일대일 연관성을 설정할 수 있습니다. 바로 가기 연결을 만드는 것 외에 다른 것을 사용하는 것이 무엇이겠습니까?레일스 has_one : 연관성을 통해

supplier.account.history 

은 그것의 경우 그렇지 않은 경우로 도달 할 것

supplier.account_history 

:

class Supplier < ActiveRecord::Base 
    has_one :account 
    has_one :account_history, :through => :account 
end 

class Account < ActiveRecord::Base 
    belongs_to :supplier 
    has_one :account_history 
end 

class AccountHistory < ActiveRecord::Base 
    belongs_to :account 
end 

우리가 그런 짓을 할 수 있습니다

레일 guide에서이 예제를 촬영 더 간단한 접근을 위해서만 기술적으로 거기에 1 대 1 협회 그쪽 수 있습니다. t는 모델을 n 번째 모델로 연결하여 일부 모델을 n-1 모델로 연결하여보다 쉽게 ​​액세스 할 수 있도록합니다. 바로 가기 외에 누락 된 것이 있습니까?

답변

47
  1. 논리는 OK가이 약세를 약간 들릴 수도 있지만, 나는 나와 함께 계정이있는 공급 업체가 "라는 말을 논리적 인 것,이의 전체 계정 기록을보고 싶어 공급 업체 "이므로 공급 업체의 계정 기록에 직접 액세스 할 수 있어야합니다. 나를 위해

  2. 효율성, 이것은 내가,이 문제 때문에 단순히 오히려 공급 업체를 호출하는 대신 문에 가입 :through를 사용하는 것이 주된 이유이며, 다음 계정, 다음 account_history. 데이터베이스 호출 수가 주목 되었습니까? account_history 얻을 보조 장비를 얻기 위해, 1 개 통화 :through 1 호출하여

    • 정상적인 관계를 이용

    • (자동 레일 계정을 통해 검색 :join 사용), 1 호출 1 호출, 공급받을 계정을 얻고, 1 호출은 내가 = 생각 무엇을 그 account_history

를 얻을 수)이 도움이되기를 바랍니다!

+2

논리 인수가 매우 유효하다고 생각합니다. 더 자연스러운 말처럼, 공급 업체의 계정 기록이 아닌 해당 공급 업체의 계정 기록을 얻으십시오. Ruby/Rails가 코드가 아닌 문장을 전달한다는 철학을 생각할 때 매우 미묘하지만 여전히 기억하기 쉽습니다. 나는 실제 DB 쿼리가 발행되는 것을 볼 수 있지만 Rails는이 메소드 호출을 SQL로 변환하는 방법을 지정합니까? – Anurag

+10

이것은 또한 Demeter의 법칙을 위반하는 것을 방지합니다. –

+2

@TomCrayford, 나는 그것이 실제로 어떻게 보이지 않습니다. 이것은 관계를 덜 직접적으로 만들어주지 않습니까? –

6
  • 역 협회는 : 고전적인 상황의 사용자 회원 그룹을 고려하십시오. 사용자가 여러 그룹의 구성원 일 수있는 경우 그룹에는 많은 구성원 또는 사용자가 있고 사용자에게는 많은 그룹이 있습니다. 그러나 사용자가 한 그룹의 구성원 일 수만 있다면 그룹에는 여전히 많은 구성원이 있습니다 (class User has_one :group, :through => :membership). class Group has_many :members, :through => memberships. 중간 모델 membership은 역관계를 추적하는 데 유용합니다.

  • 확장 성하십시오 has_one :through 관계는 쉽게 확장 및

7

내가 아무도 협회는 개체 에 감동하지 않았다 놀랄 해요 has_many :through 관계를 확장 할 수 있습니다.

has_many (또는 has_one) :through 관계는 서로 관련된 두 가지가있을 때입니다 association object pattern의 사용을 용이하게하고, 그 관계 자체가 연결이 이루어진 특성 (즉, 날짜가 나 때를 만료).

has_and_belongs_to_many ActiveRecord 도우미 대신 좋은 대안이 될 considered by some입니다. 이것에 대한 추론은 당신이 협회의 성격을 바꾸거나 그것에 추가해야 할 가능성이 매우 높고, 프로젝트에 몇 달이 걸릴 때 관계가 처음으로 설정된 경우 이것은 매우 고통 스러울 수 있습니다. has_and_belongs_to_many (두 번째 링크가 자세히 설명되어 있습니다). 초기에 has_many :through 관계를 사용하여 설정 한 경우 프로젝트에 몇 개월 동안 조인 모델의 이름을 바꾸거나 속성을 추가하기가 쉬우므로 개발자가 변화하는 요구 사항에 쉽게 대응할 수 있습니다. 변화를 계획하십시오.

관련 문제