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個のデータベースクエリがトリガーされ、すべてが遅くなるため、これは非常に悪い設計になります。
それが同じ問題に直面している誰かを助けることを願っています。