0

在Rails中,当要删除一条记录时,我想为这些已删除的记录维护一个单独的表(在结构上类似于前者)。Rails将记录删除到单独的表中

实现此目的的一种方法是明显复制第一个模型的结构,验证和关联,并将其粘贴到已删除项目模型中。但是,这会导致大量的代码冗余,而且不是可扩展的解决方案。

有没有办法实现这个Rails中没有太多(或任何)代码冗余 或可能是一个比上面提到 更具扩展性的解决方案?

我正在使用Ruby 1.9.3-p125和Rails 3.2。

UPDATE

我没有考虑在表使用附加is_deleted列,但是,我决定不这么做,因为我不想让这个表得到太大而凌乱与删帖。我不打算真正地访问这些删除的帖子 - 这些仅仅是为了记录保存或存档目的而存储的。添加此列还会使访问此表更慢,更重要的是,我担心在某处出现某种SQL条件时,我可能会错过is_deleted == false - 即使将此检查包含在模型的default_scope中。

+0

这可能是有用的:http://railspikes.com/2010/2/26/acts-as-archive – Mischa 2012-03-02 07:43:34

回答

0

那么,基本上你想保留记录,而不是把它们扔掉。因此,您可能希望将它们标记为“已删除”,并调整代码中的逻辑以在检索时不考虑这些记录。

+0

请参阅更新 - 谢谢 – 2012-03-02 07:53:16

+0

那么你可以继续为它创建一个额外的表。因为,你不打算经常访问这些记录,所以我认为安全地保存它们是相当不错的。此外,我在这里看不到任何冗余问题。您只需删除表A中的记录并将其放入表B中,只要删除完成即可。既然你想保留这些记录,你将不得不以这样或那样的方式来存储它们。 – Humming 2012-03-02 08:11:54

+0

冗余在模型中 - 关联和验证。 – 2012-03-04 20:33:24

0

在原始表格中添加一个'已删除'列。设置模型的默认范围以排除已删除的记录。

+0

请参阅更新 - 谢谢 – 2012-03-02 07:53:10

1

将它们移动到单独的表格是一个好主意,这样主表的记录数量就会减少,并且性能不会随着时间而下降。

使用Rails的ActiveRecord的回调删除即

before_destroy :move_to_trash 
. 
. 
def move_to_trash 
    Trash.create!(self) 
end 

这样,当一条记录被删除,其副本将在回收站表中创建。

+0

这不能解决冗余问题,并且与@Humming下面的答案没有什么不同。 – 2014-02-25 08:23:23