在我的模型“Post.rb”中,我试图让它只在删除列为 0 时返回帖子。换句话说,当用户删除帖子时,它不会从数据库中删除该项目,而是将其删除为 1。因此,如果我运行 Post.find(:all),我希望它自动添加条件“已删除 = '0'”。我该如何从我的模型中执行此操作?
谢谢!
在我的模型“Post.rb”中,我试图让它只在删除列为 0 时返回帖子。换句话说,当用户删除帖子时,它不会从数据库中删除该项目,而是将其删除为 1。因此,如果我运行 Post.find(:all),我希望它自动添加条件“已删除 = '0'”。我该如何从我的模型中执行此操作?
谢谢!
是的,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
)。
最简单的方法可能是为您的Post.rb
模型添加默认范围:
default_scope :conditions => {:deleted => 0}
在您的模型中,您需要指定一个 default_scope。当您想要实际获取这些已删除的帖子时,您必须覆盖默认范围。
类 Post < ActiveRecord:Base default_scope :conditions => {:deleted => 0'} end