我不确定标题是否真正正确地解释了我正在尝试做什么,所以请原谅我。我有一个名为客户的表,用于我建立的发票系统。我还有一个叫做项目和发票的表。
以下是我的数据库结构的示例(不是表中的实际列,仅作为示例)。
Clients
id
name
description
archive
Projects
id
client_id
name
description
archive
Projects
id
client_id
project_id
name
description
archive
我创建了独立归档给定发票,项目或客户的功能。但是,我希望看到最好的方法是,如果我想说客户端的项目和发票在归档客户端时自动标记为已归档。我的过程是这样的:
注意:“存档”是指存档位被翻转为1而不是0(未存档/活动)。
顺便说一下,您在归档内容的方式是在编辑屏幕上有一个“存档?”您要检查以存档该项目的复选框。
我知道在我的控制器的编辑操作中,我可以说if archive == 1
之类的内容,然后运行其他sql update语句来更新相关项else @object.save
,只保存编辑项目的数据。 / p>
有更好的方法吗?我一般提到的方式是最佳做法吗?我已经在模型中的其他地方使用:dependent => :destroy
来删除关联表中删除“父”项时的行。是否有预先构建到Rails中的内容可以让我标记我想通过表格关系做的事情?
感谢您对此提供的任何帮助!希望我能够很好地解释这个问题和问题,但如果您有疑问,请告诉我。
答案 0 :(得分:2)
更好的方法是在after_update
和Client
模型上创建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
。