使用acts_as_list gem时重置position属性? (导轨)

时间:2012-09-13 08:31:02

标签: ruby-on-rails sorting gem has-many acts-as-list

我有一个简单的Rails 3应用,其中目标有很多目标。在我的视图中,我允许用户为任何给定的目标重新排序目标,并且我使用acts_as_list gem来实现某些功能。

目标模型:

class Goal < ActiveRecord::Base
  attr_accessible :name, :description

  has_many :objectives, :order => :position, :dependent => :destroy
end

目标模型:

class Objective < ActiveRecord::Base
  attr_accessible :name, :description, :position

  belongs_to :goal

  acts_as_list :scope => :goal
end

我还想让用户更改与特定目标相关联的目标。我会假设acts_as_list gem会在目标的目标发生变化时重置位置列(因为我定义了scope => :goal),而是只保留当前位置。

对我而言,这是不可取的,因为在新目标的背景下,这个位置不再有意义。我希望重置位置,并将目标移动到与之关联的新目标的底部。所以我在Objective模型的before_save上写了这个方法:

  before_update :reset_position

  def reset_position
    if self.goal_id_changed?
      self.move_to_bottom #acts_as_list method
    end
  end

不幸的是,当我尝试保存时,这会导致stack level too deep错误。关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:2)

好的,我最终将reset_position重写为下面显示的内容,因为acts_as_list显然无法处理关联更改。

before_update :reset_position

def reset_position
  if self.goal_id_changed?
    self.position = self.goal.objectives.count > 0 ? self.goal.objectives.last.position + 1 : 1
  end
end

基本上,当它与不同的目标相关联时,它会将目标移动到目标列表的底部。似乎工作。

答案 1 :(得分:0)

我会说这是由于move_to_bottom自我试图保存记录。因此,在我看来,编写自己的此方法版本将是我的选择。从当前的acts_as_list方法开始,在没有保存的情况下开发自己的变体。