2014-12-19 2 views
0

В модели Post со многими различными областями (по дате, по автору или контенту, сумме итоговых сообщений) модель содержит атрибут status, где, если задан статус :hidden, он будет исключен из всех областей (например, сумма общего объема сообщений будет возвращать общие сообщения, где статус отличается от скрытых), существует ли способ «DRYer», чтобы сделать это вместо добавления чего-то вроде where status!=hidden в каждую область?Скрыть объекты activetecord данного состояния из всех областей применения

+0

Создание 'hidden' сферы и добавить' hidden' в каждой области. – Magnuss

ответ

0

Вы можете сделать это:

default_scope { where.not(status: :hidden) } 

Это не установлено в стальном, область по умолчанию по-прежнему сфера применения и могут быть удалены с unscoped, если вы когда-нибудь понадобится, чтобы обойти это условие:

scope :hidden { unscoped.where(status: :hidden) } 

Reference

+0

Это плохое решение, так как это сделает невозможным поиск любого скрытого сообщения. В общем, 'default_scope' следует избегать любой ценой. – tagCincy

+0

@tagCincy неправильно. Если вам нужно обойти это, сделайте «unscope». Речь идет о том, проще ли писать '.hidden' всюду, или писать' .unscope' кучу раз. Я должен отразить это в ответе, однако, спасибо за упоминание потенциальной ловушки. –

+0

Неявное программирование плохое. Ваше решение добавить default_scope в КАЖДЫЙ запрос к этой модели для решения проблемы по 3 запросам. – tagCincy

1

вы можете создать «родительскую сферу»:

scope :hidden, -> { where(status: :hidden) } 

затем в областях, которые вы хотите фильтровать скрытые, снабдите его к where:

scope :foo, -> { hidden.where(foo: :bar) } 
Смежные вопросы