1

目標に多くの目的がある単純な 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を保存しようとするとエラーが発生します。これを修正する方法についてのアイデアはありますか?

4

2 に答える 2

3

さて、私は明らかに関連付けの変更を処理しない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

基本的に、目的が別の目標に関連付けられている場合、目的を目的リストの一番下に移動します。うまくいくようです。

于 2012-09-15T13:04:31.807 に答える
0

これは、move_to_bottom がレコードを保存しようとしたためだと思います。したがって、このメソッドの独自のバージョンを作成することは、私の意見では進むべき道です。現在の act_as_list メソッドから始めて、保存せずに独自のバリエーションを開発します。

于 2012-09-13T09:59:56.750 に答える