0

在我的模型“Post.rb”中,我试图让它只在删除列为 0 时返回帖子。换句话说,当用户删除帖子时,它不会从数据库中删除该项目,而是将其删除为 1。因此,如果我运行 Post.find(:all),我希望它自动添加条件“已删除 = '0'”。我该如何从我的模型中执行此操作?

谢谢!

4

3 回答 3

3

是的,default_scope这将是最简单的方法,并且允许您继续使用诸如此类的东西Post.find(:all)而不必担心已删除的条目,但是您可能想问自己为什么要保留已删除的记录。你会因为简单地删除它们而失去任何有价值的东西吗?如果是这样,可能会有比“软删除”更好的答案。 例如,软删除的问题非常反对这种做法,并提供了一些避免它们的建议。

我个人并不反对default_scope,但它可能会变得混乱,并且在我使用它的几次中,我总是不得不返回并删除它,或者with_exclusive_scope在我的模型中放入丑陋的辅助方法来明确解决它.

因此,虽然不像 那样容易Post.find(:all),但我建议使用 anamed_scope代替

class Post < ActiveRecord::Base
  named_scope :active, :conditions => {:deleted => 0}
end

然后使用Post.active.find(:all)or Post.active.find(params[:id])。我认为它更清楚地传达了代码的意图,然后如果您的业务逻辑发生变化,它可以让您重新定义未来的“活动”是什么,并且with_exclusive_scope如果您确实想要检索Post.find(:all)(在例如,一个管理应用程序)。

编辑:正如我所怀疑的,您似乎已经在寻找绕过它的方法。:)

编辑2:您可能想查看acts_as_paranoid gem,它看起来可以为您管理很多这些东西(同时仍然允许您访问已删除的记录而无需使用with_exclusive_scope)。

于 2010-01-15T18:30:04.407 回答
2

最简单的方法可能是为您的Post.rb模型添加默认范围:

default_scope :conditions => {:deleted => 0}
于 2010-01-15T16:41:47.313 回答
1

在您的模型中,您需要指定一个 default_scope。当您想要实际获取这些已删除的帖子时,您必须覆盖默认范围。

类 Post < ActiveRecord:Base default_scope :conditions => {:deleted => 0'} end

于 2010-01-15T16:43:36.407 回答