2011-09-29 2 views
1

고객 (물론 고객 has_many 인보이스)에 속하는 인보이스 모델이 있습니다.ROR 활성 레코드의 열의로드 결과

내가 할 경우

{ 
    @invs = Invoice.find(
    :all, 
    :include => ["customer"], 
    :conditions => ['somecondition'] 
) 
} 

@invs의 클래스는 배열이고 내가 할 경우 내가 배열의 6 송장에 대한 모든 속성을 볼 수 @invs[5]를. 그러나 그 시점에서 관련 고객 레코드 속성이 표시되지 않습니다. 그것을 얻으려면 @invs[5].customer해야합니다.

제 질문은 인보이스 레코드에서 고객 레코드에 액세스 할 수있는 Ruby 구조는 무엇입니까? SomeClass의 새로운 임의 레코드를 만들고 해당 레코드 세트의 송장 레코드에 첨부하여 @inv[5].someclass 할 수 있습니다. 그게 가능하니? 만약 그렇다면 어떻게?

[편집 - 전체 기사] 다음은 왜 질문하고 있는지 설명하려고합니다.

내 인보이스 모델이 Db의 단일 테이블과 관련되어 있지만 내 고객 레코드가 보관되어 구조상 고객과 동일한 Archcustomer라는 다른 테이블로 이동할 수 있습니다. 그래서 Invoice belongs_to Archcustomer 및 Archcustomer has_many Invoices와 같은 추가 연결이 있습니다.

고객 기록 (고객 또는 Archcustomer)에 관계없이 관련 고객 기록과 함께 인보이스 목록을 가져와야하지만 Customer.category_id 및 Customer.id 및 Invoice.id로 정렬해야합니다.

@invs 위의 원래 예제에서 나는 고객 레코드를 포함하고 있는데 : order => 'customer.category_id, customer.id, invoice.id'절을 포함 할 수 있지만 고객 레코드는 고객 레코드에 보관됩니다 없다.

그래서 나는 다음을 수행 할 것이라고 생각 :

{ 
    @invs.each do |inv| 
    next if inv.customer != nil 
    archcust = Archcustomer.find(inv.customer_id) #since it's not in customer get it from Archcustomer 
    inv.customer.category_id = archcust.category_id 
    etc... 
    ... 
    end 
} 

다음은 inv.sort_by @ 사용합니다. 그러나 그것은 Nil 클래스의 customer.category_id에 값을 할당하려고하기 때문에 불평합니다.

Invoice에 임의의 레코드를 첨부 할 수 있다면 Archcustomer 또는 Customer의 정보를 입력하고 sort_by를 호출하는 공통 속성 집합을 가질 수 있다고 생각했습니다.

물론 내 송장 세트를 주문할 때 다른 방법이 있다면 원하는대로 주문 해 드리겠습니다. 송장 모델에서

+0

지금 정확히 하시겠습니까? '@invs [n] .customer.customer_method'는 LoD를 너무 많이 위반합니까 아니면 다형성 관계를 맺고 있습니까? – jimworm

+0

@jimworm OK 이야기를 읽지 않아도 모든 사람을 구하려고 노력하고 있었지만, 내가하려고하는 것을 이해하기 위해 이야기를하는 것이 필요하다고 생각합니다. 그래서 .... 위의 편집 된 게시물을 참조하십시오. 관심과 성원에 감사드립니다. – nexar

답변

2

(당신이 장소에 Archcustomer 관계가 가정) :

class Invoice < ActiveRecord::Base 
    def customer_record 
    customer or archcustomer 
    end 
end 

사용 @invoice.customer_record 대신 @invoice.customer 또는 @invoice.archcustomer이 가능한 소스에서 레코드를 얻을 필요가있다. 로딩 할 때 둘 다 .include입니다.

이미 Archcustomer 인 경우 가상 번호 Customer에 물건을 할당하는 것을 고민하지 마십시오. customer_record.category_idsort_by을 실행하면됩니다.

+0

와우는 내가 그걸 할 수 있는지 몰랐다. 나는 당신이 말하는 것을 따라하지만, "로드 할 때 두 가지를 포함하십시오."주석에 대해 명확하지는 않습니다. 내가해야 할 일은 : invs = Invoice.find (: all, : include => [ "customer", "archcustomer"], : condition => [ 'someconditions'])? 더 중요한 것은 my : order => "customer_record.category_id 등을 동시에 포함 할 수 있습니까? 당신의 신속한 도움에 감사합니다. – nexar

+0

예, customer_record를 사용할 때 고객과 ​​archcustomers 모두를로드해야합니다 .'custom_record' isn ' 실제 관계를 클래스 차원 (인스턴스 메소드)으로 만들었으므로 멋진 SQL 작업없이 ActiveRecord의 이점을 무효화 할 수는 없습니다. – jimworm

+0

Rails 3 구문을 혼합했습니다. 레일 2에있을 때 거기에 있지만 원칙은 동일합니다. – jimworm

관련 문제