Ancestry Gem 'undefined method' error

2019-08-29 09:29发布

问题:

I am using the Ancestry Gem and I am getting an undefined method "arrange" for #<Array:0x007f8d58e58700> error with the following code:

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

However, When I just output @shipmgr_carriers I get an array with ancestry:

[#<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">] 

Can anyone tell me why I am unable to call the .arrange method on the array variable?

回答1:

I haven't used Ancestry but it looks like it adds the arrange method to ActiveRecord::Base. It doesn't add this method to Array and so you shouldn't expect it to work on an array.

I'm assuming you're declaring @shipmgr_carriers in your controller something like this:

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

Try this instead:

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

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

My hunch is that by the time @shipmgr_carriers gets to your view the query has already been run, transforming it into an array of results instead of a relation.

This is logic that should probably be done in the controller anyway, so moving it out of the view is a good idea regardless.



回答2:

The arrange() method acts either at the class level or on a named scope, not on a returned array of values. For example, if you want to call arrange() on a table called 'Activity', this would work and return the entire table in an arranged format:

Activity.arrange

However, if you want to call arrange on a specific tree in the table you would go:

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

'subtree' is a named scope provided by the has_ancestry gem. Therefore, the arrange() method should work for the following named scope:

  • ancestors
  • children
  • sibblings
  • descendants
  • subtree