2012-03-14 2 views
3

I 다음과 같습니다 액티브 :: EagerLoadPolymorphicError : :이 다형성 merchant_owner와 가맹점에 가입하고 얻을 것을 시도하고 어떻게Arel 및 다형성 협회에 가입

class BaseReseller < ActiveRecord::Base 

    set_table_name "resellers" 

    acts_as_nested_set 

    has_many :merchants, :as => :merchant_owner, :dependent => :destroy 
end 

class IPSP < BaseReseller 
end  

class Agent < BaseReseller 
end 

class Reseller < BaseReseller 
end 

class Merchant < ActiveRecord::Base 
    belongs_to :merchant_owner, :polymorphic => true 
end 

class MerchantsController < ApplicationController 
    ... 
    def index 
    ... 
    @merchants = Merchant.joins(:merchant_owner) # breaks! 
    end 
end 

공지 사항 간절히의 다형성 연관 관계를로드 할 수 없습니다 merchant_owner.

@merchants = Merchant.includes (: merchant_owner)는 처음에는 작동하지만 뷰에서 @merchants 배열을 반복 할 때 같은 오류가 발생합니다. 지연된 릴레이션과 비 Arel 메소드가 호출 될 때만 실제로 DB로 이동합니다.

아이디어가 있으십니까? Arel은 다형성 연관 조인을 지원합니까? 해결 방법은 무엇입니까? 나는 순수한 SQL로 떨어질 수 있지만 이것은 돼지입니다.

감사

답변

0

테이블 중 하나에 누락 된 열이 있습니다. Rails는 STI 계층 구조 간의 다형성 연결을 매우 잘 지원하지만 다형성, STI 등에 대한 정확한 열에 대해서는주의해야합니다.

0

이 Arel의 요구에 너무 많이있을 수 있습니다, 나는 훌륭한 솔루션의 확실하지 않다. 귀하의 경우 모든 merchant_owners가 동일한 리셀러 테이블을 공유하는 것처럼 보이므로 다형성 연결에서 조인하려는 것이 합리적입니다. 그러나 일반적으로 다형성 연결은 데이터 모델 전체에서 다양한 모델 (다른 테이블 용)과 관련 될 수 있습니다 . 이것은 SQL에서 꽤 못 생기고 일반적으로 꽤 느려서 EagerLoadPolymorphicError가 존재할 것이라고 기대하는 이유입니다. 물론

Merchant.joins("INNER JOIN resellers on merchant_owner_id = resellers.id") 

이 방금 강등 Merchant.joined_with_owners과 SQL을 할 수 있도록 모델의 범위로 조인은 깨끗한 것 : 상황의 경우, 같은 주변에 일을 이해 할 수 모델 레이어에 추가합니다. 그러나 리셀러가 아닌 다른 모델에 많은 판매자가있는 경우에는 작동하지 않습니다.

Merchant.includes (: merchant_owner)에서 동일한 오류가 발생하는 것을보고 놀랍지 만 다양한 속성에 액세스 할 때도 비슷한 데이터가 표시되지 않지만 다양한 차이가있을 수 있습니다.

성능상의 이유로 또는 리셀러 속성에 의존하는 추가 Arel where 절이 있기 때문에 열심히로드하려고합니까? 성능면에서는 SQL에 가장 적합 할 수도 있습니다 ...

+1

사실 "and '에'merchant_owner_type in '을 추가하여 조인을 보호하려고합니다. , 'Reseller', 'IPSP') " – njorden