Rails 3 - 在归档父项时标记归档的依赖项

时间:2012-11-01 15:30:16

标签: ruby-on-rails-3

我不确定标题是否真正正确地解释了我正在尝试做什么,所以请原谅我。我有一个名为客户的表,用于我建立的发票系统。我还有一个叫做项目和发票的表。

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

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 update语句来更新相关项else @object.save,只保存编辑项目的数据。 / p>

我的问题?

有更好的方法吗?我一般提到的方式是最佳做法吗?我已经在模型中的其他地方使用:dependent => :destroy来删除关联表中删除“父”项时的行。是否有预先构建到Rails中的内容可以让我标记我想通过表格关系做的事情?

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

1 个答案:

答案 0 :(得分:2)

更好的方法是在after_updateClient模型上创建Project

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