0

フォーラムとトピックの 2 つのモデルがあります。フォーラムには多くのトピックがあります。それぞれにアクティブなブール値があります。フォーラムでアクティブ フラグを反転すると、そのトピックのすべてのフラグも反転されます。私の考えは、self.active でない限り、before_save def before_save でこれを行うことでしたか? self.topics.each{|トピック| topic.close} 終了

トピックでは、close メソッドを定義しました: def close self.active = false self.save end

ここで間違ったアプローチをとっているのでしょうか (コントローラーのように他の場所でやるべきでしょうか?) エラーは発生しませんが、フラグを false に設定しても何も起こりません (すべてを反転させたいとは限りません)。フォーラムをアクティブに設定するとトピックがアクティブになるので、これは一方向に進むだけで済みます)。

ありがとう

4

1 に答える 1

0

いいえ、あなたは正しいアプローチをしています。ほんの少しの微調整が必​​要です。以下の例を参照してください。

class Forum < ActiveRecord::Base
  has_many :topics
  after_save :close_topics!

  def close!
    self.active = false
    self.save!
  end

  private

  def close_topics!
    self.topics.each(&:close!) unless self.active
  end
end

class Topic < ActiveRecord::Base
  belongs_to :forum

  def close!
    self.active = false
    self.save!
  end
end

ActiveRecord Observerを使用することもできます。この方法でクラスをより分離しているため、私は個人的にフィルターよりもこれを好みます。そして、私は関心事の適切な分離を好む傾向があるので..

# rails generate observer Forum

class ForumObserver < ActiveRecord::Observer

  def after_save (forum)
    forum.topics.each(&:close!) unless forum.active
  end

end

これらのレコードが非アクティブ化されると、再びアクティブになることはないと思います。ただし、逆のケースを処理するための追加機能のコードは無視できます。

PS構文に慣れていない場合は&:handler、列挙可能なアイテムごとに関数または変数にマッピングするためのショートカットです。

于 2011-10-11T05:10:23.043 に答える