2012-01-16 3 views
0

나는 조상 보석을 사용하고 난 다음 코드를 가진 undefined method "arrange" for #<Array:0x007f8d58e58700> 오류가 점점 오전 : 난 그냥 출력 @shipmgr_carriers 내가 조상과 배열을 얻을 때, 그러나조상 보석 '정의되지 않은 메서드'오류

<%= @shipmgr_carriers.arrange(:order => :name) %> 

을 :

[#<Shipmgr::Carrier id: 9, name: "testing", status: nil, created_at: "2012-01-16 22:44:28", updated_at: "2012-01-16 22:44:28", ancestry: nil>, #<Shipmgr::Carrier id: 10, name: "test", status: nil, created_at: "2012-01-16 22:44:28", updated_at: "2012-01-16 22:44:28", ancestry: "9">] 

왜 내가 배열 변수에 .arrange 메서드를 호출 할 수 없는지 알 수 있습니까?

답변

1

나는 Ancestry를 사용하지 않았지만 ActiveRecord :: Base에 arrange 메서드를 추가 한 것처럼 보입니다. 이 메서드는 Array에 추가되지 않으므로 배열에서 작동하지 않아야합니다.

난 당신이 같은 컨트롤러 무언가 @shipmgr_carriers를 선언하고 있으리라 믿고있어 :

class SomeController < ActionController::Base 
    def some_action 
    @shimgr_carriers = SomeModel.find(...).carriers 
    end 
end 

대신이 시도 :

def some_action 
    @shipmgr_carriers = SomeModel.find(...).carriers 

    @shipmgr_carriers_arranged = @shipmgr_carriers.arrange(...) 
end 

내 직감은 그 @shipmgr_carriers이보기에 도달하는 시간으로 쿼리는 이미 실행되어 관계 대신 결과의 배열로 변환됩니다.

이것은 컨트롤러에서 수행해야하는 로직이므로보기 밖으로 이동하면 관계없이 좋은 생각입니다.

0

arrange() 메서드는 반환 된 값 배열이 아니라 클래스 수준 또는 명명 된 범위에서 작동합니다. 당신은 '활동'이라는 테이블에) (준비 호출 할 경우 예를 들어,이 일 것와 배열 형식으로 전체 테이블을 반환 : 특정에 배치 호출 할 경우,

Activity.arrange 

그러나 당신이 갈 것 테이블에 나무 :

Activity.find(...).subtree.arrange 

'하위 트리'는 has_ancestry 보석에 의해 제공되는 명명 된 범위입니다. 하위 트리를

  • 어린이
  • sibblings
  • 후손
    • 조상
    을 : 따라서 다음과 같은 명명 된 범위에 대한 작동합니다() 메소드를 주선
  • 관련 문제