Ancestry Gem'未定义方法'错误

时间:2012-01-16 22:56:55

标签: ruby-on-rails ruby-on-rails-3 rubygems

我正在使用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方法?

2 个答案:

答案 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()方法应该适用于以下命名范围:

  • 的祖先
  • 儿童
  • sibblings
  • 后代
  • 子树