在我的模型“Post.rb”中,我试图让它仅在删除列为0时返回帖子。换句话说,当用户删除帖子时,它不会从数据库中删除该项目,但是相反,将其删除为1.因此,如果我运行Post.find(:all),我希望它自动添加条件“deleted ='0'”。我如何从我的模型中做到这一点?
谢谢!
答案 0 :(得分:3)
是的,default_scope
将是最简单的方法,并允许您继续使用Post.find(:all)
之类的内容,而不必担心已删除的条目,但您可能想问自己为什么要保留已删除的记录无论如何。简单地删除它们会失去什么价值吗?如果是这样,可能有一个比“软删除”更好的答案。例如,The trouble with soft deletes非常反对这种做法,并提出了一些避免这种做法的建议。
我个人对default_scope
没有任何反对意见,但它可以变得混乱,并且在我使用它的几次中,我总是不得不回去删除它,或者在我的模型中加入丑陋的with_exclusive_scope
辅助方法来明确解决它。
所以,虽然不像Post.find(:all)
那么容易,但我建议使用named_scope
而不是
class Post < ActiveRecord::Base
named_scope :active, :conditions => {:deleted => 0}
end
然后使用Post.active.find(:all)
或Post.active.find(params[:id])
。我认为它更清楚地表达了代码的意图,然后它可以让你重新定义未来如果你的业务逻辑发生变化,那么“活跃”是什么,如果你真的这样做,它不会让你跳过with_exclusive_scope
箍想要检索Post.find(:all)
(例如,在管理员应用中)。
修改:我怀疑,它看起来像you're already looking for ways to get around it。 :)
编辑2 :您可能希望查看acts_as_paranoid gem,它会为您管理大量此类内容(同时仍然允许您访问已删除的记录而不使用{ {1}})。
答案 1 :(得分:2)
最简单的方法可能是为您的Post.rb
模型添加默认范围:
default_scope :conditions => {:deleted => 0}
答案 2 :(得分:1)
在您的模型中,您需要指定default_scope。当您想要实际获取这些已删除的帖子时,您必须覆盖默认范围。
class Post&lt; ActiveRecord的:基地 default_scope:conditions =&gt; {:deleted =&gt; 0' } 端