1

我不确定标题是否真的正确解释了我正在尝试做的事情,所以请原谅我。我有一个名为 clients 的表,用于我构建的发票系统。我也有称为项目和发票的表格。

这是我的数据库结构的示例(不是表中的实际列,仅作为示例)。

Clients
    id
    name
    description
    archive

Projects
    id
    client_id
    name
    description
    archive

Projects
    id
    client_id
    project_id
    name
    description
    archive

我已经创建了独立归档给定发票、项目或客户的能力。但是,我想看看如果我想让客户的项目和发票在我存档客户时自动标记为存档,那么最好的方法是什么。我的过程是这样的:

  • 存档客户将存档客户、具有该客户 ID 的所有项目以及具有相同客户 ID 的所有发票。
  • 归档项目将归档项目和具有该项目 ID 的所有发票。
  • 归档发票只是归档发票本身

注意:“存档”是指存档位被翻转为 1 而不是 0(未存档/活动)。

顺便说一句,你存档的方式是在编辑屏幕上有一个“存档?” 您将选中以存档项目的复选框。

我知道在我的控制器中的编辑操作中,我可以说类似if archive == 1然后运行附加的 sql 更新语句来更新依赖项else @object.save以保存已编辑项的数据。

我的问题?

有一个更好的方法吗?我通常提到的方式是最佳实践吗?当删除“父”项时,我已经:dependent => :destroy在模型中的其他地方使用删除关联表中的行。Rails 中是否有一些预置的东西可以让我通过表的关系来标记我正在尝试做的事情?

感谢您对此的任何帮助!希望我能很好地解释问题和问题,但如果您有问题,请告诉我。

4

1 回答 1

2

更好的方法是after_updateClientandProject模型上创建一个:

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 回答