目標に多くの目的がある単純な 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
また、特定の目標が関連付けられている目標をユーザーが変更できるようにしたいと考えています。Objective の Goal が変更されるたびに gem が position 列をリセットすると想定していましたacts_as_list
が ( を定義したためscope => :goal
)、代わりに現在の位置を保持するだけです。
私にとって、これは望ましくありません。なぜなら、新しい目標のコンテキストでは位置が意味をなさないからです。むしろ、位置がリセットされ、目的が関連付けられている新しい目標の下部に移動されることを望みます。before_save
そこで、Objective モデルで発生するこのメソッドを書きました。
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
を保存しようとするとエラーが発生します。これを修正する方法についてのアイデアはありますか?