Task
次のモデルはどうですか。
class Task < ActiveRecord::Base
belongs_to :project
def after_save(task)
self.project.finish_date = self.finish_date
end
end
プロジェクトfinish_date
はタスクに設定されますfinish_date
。コードは、現在保存されているタスクには常にfinished_date
他のタスクと同じように後であると想定しています。それは間違った仮定です、ただ適切なif
ステートメントを追加してください:)
編集
コメントからの私の提案は、Task
上記のように設定し、次のようにfinish_date
セッターを上書きすることです。Project
class Project < ActiveRecord::Base
has_many :tasks
def finished_date=(new_finish_date)
self[:finish_date] = new_finish_date if self[:finish_date] < new_finish_date
end
end
私は頭からコーディングしているので、この後にプロジェクトインスタンスを保存する必要があるかどうかわかりません。おそらくupdate_attributes
、セッターで使用する方が良いかもしれません。
ここで他の解決策について
@Joeliosソリューションは、セッターをオーバーライドするだけでなく、私が行ったことを提案しました。それに関する問題は、Railsに含まれるメソッドが常にセッター(偶数update_attributes
とcreate
)を使用することです。それで、あなたはupdate_task_date
自分でメソッドを呼び出さなければなりませんでしたが、それは忘れてしまうかもしれません。
@saveriosソリューションは、Observer/Observableパターンを使用することを提案しています。それで、私が見るように、そのすべてのオブジェクトProject
のオブザーバーになるでしょう。Task
変更されると、Task
すべてのオブザーバー、つまりプロジェクトを呼び出し、プロジェクト自体がを更新しますfinish_date
。デザインパターンを使用するだけで提案したものとほとんど同じではないため、より困難になります。
考えられるもう1つの解決策は、接続されているすべてのタスクを繰り返し処理して最新のを探すような新しい関数を定義するupdate
ことProject
ですfinish_date
。そのupdate
メソッドは、タスクが更新されるたびに呼び出す必要があります。n個のタスクの1つを更新するたびに、n個のデータベースクエリがトリガーされ、すべてが遅くなるため、これは非常に悪い設計になります。
それが同じ問題に直面している誰かを助けることを願っています。