我正在使用Ancestry Gem,我收到undefined method "arrange" for #<Array:0x007f8d58e58700>
错误,其中包含以下代码:
<%= @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方法?
答案 0 :(得分: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
到达您的视图时,查询已经运行,将其转换为结果数组而不是关系。
这是逻辑,无论如何都应该在控制器中完成,所以无论如何将它移出视图是个好主意。
答案 1 :(得分:0)
arrange()方法在类级别或命名范围内起作用,而不是在返回的值数组上起作用。例如,如果要在名为“Activity”的表上调用arrange(),这将起作用并以排列的格式返回整个表:
Activity.arrange
但是,如果你想在表格中的特定树上打电话安排,你会去:
Activity.find(...).subtree.arrange
'subtree'是has_ancestry gem提供的命名范围。因此,arrange()方法应该适用于以下命名范围: