2012-10-11 59 views
1

在我的网站上,版主可以标记垃圾评论。当这些评论被标记时,他们会被隔离,所以他们不会再出现在常规视图中,尽管他们仍然可以在管理控制台中看到。此刻,我排除他们从常规视图,像这样:导轨3:默认排除结果

@comments = Comment.where(:flagged => false) 

我在每一个在它的意见,其中有许多控制器做到这一点。我觉得有一个更清晰的方式来处理Rails中的这个问题。也许在评论模型的某个地方,我可以指定在查询评论时只检索那些没有标记的评论。如果是这样,那是怎么做的?即使这是不可能的,是否有其他方式来干这个代码?

回答

5

u可以使用默认的范围

default_scope where(:flagged => false) 

看到http://apidock.com/rails/ActiveRecord/Base/default_scope/class

默认范围可以用未范围被忽略。请参阅http://apidock.com/rails/ActiveRecord/Base/unscoped/class

我宁愿使用范围而不是默认范围,因为我不需要在需要所有记录时重写它。取决于获取所有/无标记记录的频率。

+0

这是正确的想法,但你的代码是不正确的。它应该是:'default_scope where(:flagged => false)'。你从哪里得到“无风险”? – Mischa

+0

在这种情况下,有4个视图会使用默认范围和1个视图来排除它。似乎违约是更有效的方法,除非有什么我不知道。 – nullnullnull

+0

你是对的。我编辑了我的答案。 –

2

做一个范围(命名为这个例子“干净”):

class Comment < ActiveRecord 
    scope :clean, where(:flagged => false) 
end 

然后使用:

@comments = Comment.clean 

为了适应未来发展,你可能会想添加一个名为default_view一个类的方法它只是调用clean并使用它。随着您的“默认”需求发生变化,请修改default_view方法。