【问题标题】:Rails delete records into separate tableRails 将记录删除到单独的表中
【发布时间】:2012-03-02 07:29:36
【问题描述】:

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

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

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

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

更新

我确实考虑在表格中使用额外的 is_deleted 列,但是,我决定不这样做,因为我不希望这张表格变得太大而且被删除的帖子弄得一团糟。我并不打算真正访问这些已删除的帖子——这些帖子只是为了记录或存档目的而存储的。添加此列还会使访问此表更慢,更重要的是,我担心我可能会在某个 SQL 条件下错过检查 is_deleted == false - 即使我在模型的 default_scope 中包含此检查。

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 model-associations


【解决方案1】:

最好将它们移动到单独的表中,这样您的主表中的记录数就会减少,并且性能不会随着时间的推移而降低。

使用 Rails ActiveRecord 回调进行删除,即

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

这样,当一条记录被删除时,它的副本会在 Trash 表中创建。

【讨论】:

  • 这并没有解决冗余问题,和@Humming下面的回答没有区别。
【解决方案2】:

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

【讨论】:

  • 那么您可以继续为此创建一个附加表。由于您不打算经常访问这些记录,因此我认为将它们安全地保存是完全可以的。此外,我在这里看不到任何冗余问题。只要删除完成,您所要做的就是从表 A 中删除记录并将它们放入表 B 中。由于您希望保留这些记录,因此您必须以一种或另一种方式存储它们。
  • 模型中的冗余——关联和验证。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多