2012-01-16 3 views
0

Я использую родословную Gem и я получаю undefined method "arrange" for #<Array:0x007f8d58e58700> ошибки с помощью следующего кода:родословной Gem ошибка

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

Однако, когда я только выход @shipmgr_carriers я получаю массив с родословной:

[#<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, но похоже, что он добавляет метод arrange к ActiveRecord :: Base. Он не добавляет этот метод в 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

Метод arr() действует как на уровне класса, так и на именованной области, а не на возвращаемом массиве значений. Например, если вы хотите позвонить организовать() на столе под названием «активность», это будет работать, и вернуть всю таблицу в устроенном формате:

Activity.arrange 

Однако, если вы хотите позвонить организовать на конкретный дерево в таблице вы бы:

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

«поддерево» является именованным предусмотрено has_ancestry камня. Таким образом, метод расположить() должен работать на следующей имени сферы:

  • предков
  • дети
  • sibblings
  • потомки
  • поддереву