如何在Ruby on Rails中编写mark_as_deleted方法?

时间:2011-02-22 16:52:07

标签: ruby-on-rails-3

我想编写一个方法,它应该像任何Rails默认控制器中的destroy方法一样工作,但不应该真正删除数据。相反,它应该设置一个标志或我可以在我的视图中评估的东西,以便不再显示这些数据。

因此,当用户点击“删除”时,相应的操作应将数据标记为已删除,但不会清除数据库中的数据。

编写这种方法最优雅的方法是什么?我正在使用Rails 3。

2 个答案:

答案 0 :(得分:5)

如果您要做的只是显示或隐藏数据,我会在数据库中有一个布尔is_visible字段。

此外,不是在您的视图中评估是否显示此数据,而是将该逻辑放在模型中,位于default_scope(在rails 3中可用)。所以这样的事情(假设你想显示/隐藏Articles)......

# model
class Article < ActiveRecord::Base
  default_scope where(:is_visible => true)
end

显然,你的删除方法应该只将is_visible布尔值设置为false,在创建时它应默认为true

如果您的数据与其他数据有关系,那么您只需要小心。在此示例中,如果您有Articles且他们有Comments,那么如果将Comments标记为不可见,则您可能不希望Article出现在任何位置。

答案 1 :(得分:3)

在我的一些应用中,我在名为status的内容类型中添加了一列,可以是“已发布”,“草稿”或“已删除”。这样,用户可以制作草稿或删除已发布的项目,而不会弄乱索引视图。

就优雅而言,它可能不是最好的,但我只是在内容类型上创建new_draft方法,这会创建一个status设置为“草稿”的新对象。然后,当用户发布他们的草稿时,我会调用post方法将status设置为“已发布”。发布后,如果用户移除了他们的商品,我会调用remove方法(您猜对了!)将status设置为“已移除”。