1

タイトルが本当に私がやろうとしていることを正しく説明しているかどうかはわかりませんので、ご容赦ください。構築した請求システムのクライアントというテーブルがあります。プロジェクトと請求書というテーブルもあります。

これが私のデータベース構造の例です(単なる例として、テーブルの実際の列ではありません)。

Clients
    id
    name
    description
    archive

Projects
    id
    client_id
    name
    description
    archive

Projects
    id
    client_id
    project_id
    name
    description
    archive

特定の請求書、プロジェクト、またはクライアントを個別にアーカイブする機能を作成しました。ただし、クライアントをアーカイブするときに、クライアントのプロジェクトと請求書が自動的にアーカイブ済みとしてマークされるようにする場合、これを行うための最良の方法を確認したいと思いました。私のプロセスは次のようになります。

  • クライアントをアーカイブすると、クライアント、そのクライアントIDを持つすべてのプロジェクト、および同じクライアントIDを持つすべての請求書がアーカイブされます。
  • プロジェクトをアーカイブすると、プロジェクトとそのプロジェクトIDを持つすべての請求書がアーカイブされます。
  • 請求書のアーカイブは、請求書自体をアーカイブするだけです

注:「アーカイブ済み」とは、アーカイブビットが0ではなく1に反転することを意味します(アーカイブ/アクティブではありません)。

ちなみに、何かをアーカイブする方法は編集画面に「アーカイブ?」があります。アイテムをアーカイブするためにチェックするチェックボックス。

if archive == 1コントローラの編集アクションで、追加のsql updateステートメントを実行して依存アイテムelse @object.saveを更新し、編集されたアイテムのデータを保存するようなことを言うことができることを知っています。

私の質問?

これを行うためのより良い方法はありますか?私が言及した方法は、一般的にベストプラクティスですか?:dependent => :destroy「親」アイテムが削除されたときに、関連するテーブルの行を削除するために、モデルの他の場所をすでに使用しています。Railsに組み込まれているもので、テーブルの関係を介して実行しようとしていることをマークできますか?

これで助けてくれてありがとう!問題と質問について十分に説明できれば幸いですが、質問がある場合はお知らせください。

4

1 に答える 1

2

より良い方法は、モデルafter_update上にを作成することです:ClientProject

class Client < ActiveRecord::Base
  after_update :archive_check

  private
  def archive_check
    projects.each{|p| p.archive = self.archive; p.save} if self.archive_changed?
  end
end

class Project < ActiveRecord::Base
  after_update :archive_check

  private
  def archive_check
    invoices.each{|i| i.archive = self.archive; i.save} if self.archive_changed?
  end
end

したがって、クライアントを保存すると、archive_checkがトリガーされます。そして、アーカイブされている場合は、関連するすべてのを更新しますprojects。を更新するprojectsと、今回は各請求書archive_checkのモデルでもトリガーされます。Project

于 2012-11-01T15:52:40.870 に答える