我有一个简单的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
错误。关于如何解决这个问题的任何想法?
答案 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方法开始,在没有保存的情况下开发自己的变体。