2012-10-11 2 views
1

На моем сайте модераторы могут помечать спам-комментарии. Когда эти комментарии помечены, они попадают в карантин, поэтому они больше не отображаются в обычных представлениях, хотя их все еще можно увидеть в панели управления. На данный момент, я исключить их из обычных взглядов, как так:Rails 3: Исключая результаты по умолчанию

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

Я делаю это в каждом контроллере, который имеет комментарии в нем, из которых есть много. У меня такое ощущение, что в Rails есть более чистый способ справиться с этим. Возможно, где-то в модели комментариев я могу указать, что при запросе комментариев вы получаете только те, которые не помечены. Если да, то как это делается? И даже если это невозможно, есть ли другой способ высушить этот код?

ответ

5

и можно использовать сферу по умолчанию

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 где (: flagged => false)'. Откуда вы взяли 'unflagged'? – Mischa

+0

В этом случае существует 4 вида, которые будут использовать область по умолчанию и 1 вид, который исключил бы его. Похоже, что дефолт - это более эффективный подход, если только я не знаю. – nullnullnull

+0

u r справа. Я отредактировал свой ответ. –

2

Сделать сферу (названный «чистым» для данного примера):

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

Затем используйте:

@comments = Comment.clean 

Для будущего влагоизоляции, вы можете можете добавить метод класса под названием default_view который просто вызывает clean и использует это вместо этого. По мере изменения ваших настроек по умолчанию просто измените метод default_view.

Смежные вопросы