如何让模型指定先决条件?

时间:2010-01-15 16:39:13

标签: ruby-on-rails associations models

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

谢谢!

3 个答案:

答案 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' } 端