Rails has_one : 연결을 통해
Rails에는 has_one :through
두 번째 모델을 통해 세 번째 모델과 일대일 연결을 설정하는 데 도움 이되는 연결이 있습니다. 바로 가기 연결을 만드는 것 외에 실제 사용은 무엇입니까? 그렇지 않으면 추가 단계가 될 것입니다.
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
다음과 같은 작업을 수행 할 수 있습니다.
supplier.account_history
그렇지 않으면 다음과 같이 도달합니다.
supplier.account.history
더 단순한 액세스만을위한 경우 기술적으로 더 쉬운 액세스를 위해 n-1 모델을 통과하는 n 번째 모델과 모델을 연결하는 일대일 연관이있을 수 있습니다. 바로 가기 외에 내가 놓친 다른 것이 있습니까?
Logic , 좋습니다. 약간 약하게 들릴 수 있지만 "계정이있는 공급 업체가 있습니다.이 공급 업체의 전체 계정 내역을보고 싶습니다"라고 말하는 것이 합리적이므로 나에게 적합합니다. 공급 업체의 계정 내역에 직접 액세스 할 수 있습니다.
효율성 , 이것이 내가 사용하는 주된 이유입니다
:through
. 단순히 공급자를 호출 한 다음 계정을 호출 한 다음 account_history를 호출하는 대신 조인 문을 발행하기 때문입니다. 데이터베이스 호출 수를 알고 계십니까?사용
:through
, 1 호출하면 공급 업체를 얻기 위해, 1 호출이 account_history 얻기 위해 (자동 레일은 사용:join
계정을 통해 검색)일반 연결 사용, 공급 업체 가져 오기 1 번, 계정 가져 오기 1 번, account_history 가져 오기 1 번
그것이 내가 생각하는 것입니다 =) 도움이되기를 바랍니다!
아무도 Association Objects를 건드리지 않았다는 것에 놀랐습니다 .
has_many
(또는 has_one
) :through
관계는의 사용을 용이하게 연결 객체 패턴 은 서로 관련된 두 가지가있을 때, 그리고 그 관계 자체가 (연관이되었다 즉 날짜 또는 만료시) 특성을가집니다.
이것은 ActiveRecord 도우미 의 좋은 대안으로 간주됩니다has_and_belongs_to_many
. 그 이유는 협회의 성격을 변경하거나 추가해야 할 가능성이 매우 높기 때문이며, 프로젝트를 시작한 지 몇 달이되었을 때 관계가 처음에 다음과 같이 설정 되었다면 매우 고통 스러울 수 있습니다. a has_and_belongs_to_many
(두 번째 링크는 좀 더 자세히 설명합니다). 처음에 has_many :through
관계를 사용하여 설정 한 경우 프로젝트가 시작된 후 몇 달이 지나면 조인 모델의 이름을 바꾸거나 속성을 추가하기가 쉬워 개발자가 변화하는 요구 사항에보다 쉽게 대응할 수 있습니다. 변화를위한 계획.
역 연관 : 고전적인 상황 사용자 멤버십 그룹을 고려하십시오. 사용자가 여러 그룹의 구성원이 될 수있는 경우 그룹에는 많은 구성원 또는 사용자가 있고 사용자는 많은 그룹을 갖습니다. 사용자가 하나 개의 그룹의 구성원이 될 수 있다면,이 그룹은 여전히 많은 회원이 있습니다
class User has_one :group, :through => :membership
만class Group has_many :members, :through => memberships
. 중간 모델membership
은 역 관계를 추적하는 데 유용합니다.확장 성 하십시오
has_one :through
관계를 쉽게 확장하고 확장 할 수있는has_many :through
관계
참고 URL : https://stackoverflow.com/questions/2116017/rails-has-one-through-association
'Development Tip' 카테고리의 다른 글
Qt 정적 연결 및 배포 (0) | 2020.11.18 |
---|---|
Covered Index 란 무엇입니까? (0) | 2020.11.18 |
.NET의 System.Version이 Major.Minor.Build.Revision으로 정의 된 이유는 무엇입니까? (0) | 2020.11.18 |
adb shell su는 작동하지만 adb root는 작동하지 않습니다. (0) | 2020.11.18 |
.NET / C #에서 SVG 그리기? (0) | 2020.11.18 |