使用acts_as_list宝石时重置位置属性? (导轨)(Resetting position

2019-10-17 05:45发布

我有一个简单的Rails应用程序3其中目标有很多目标。 在我的意见,我允许用户对重新排序目标对于任何给定的目标,我现在用的是acts_as_list宝石来实现一些此功能。

目标模式:

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宝石将重置每当一个目标的目标是改变了位置的列(因为我定义的scope => :goal ),而是它只是保留当前的位置。

对我来说,这是不可取的,因为该位置不再是一个新的目标的背景下才有意义。 我宁愿该位置被复位,目标移动到其关联的新的目标的底部。 所以我写了这个方法上发生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 ,当我试图保存错误。 任何想法我怎么能解决这个问题?

Answer 1:

好吧,我结束了重新编写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

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



Answer 2:

我LD说,这是由于move_to_bottom自我试图保存记录。 所以,写你自己的这种方法的版本将在我看来要走的路。 从目前acts_as_list方法启动和发展离不开保存自己的变化。



文章来源: Resetting position attribute when using acts_as_list gem? (Rails)