2012-04-04 5 views
1

У меня есть несколько моделей, которые belong_to :status.Запрет на модель

Статусы являются:

  • Активных
  • Hidden
  • Banned

У меня есть области, установленные для каждого из статусов, и они применяются к пользователям и ряд других содержательным моделей, но давайте возьмем, например, User.

по привычке, я пишу User.find(15) или User.all или User.last(5) или @category.users

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

  • User.active.where(...)
  • User.active
  • User.active.last(5)
  • @category.users.active

Это просто кажется нетрадиционным. К сожалению, эти модели используются во многих случаях, поэтому мне хотелось бы, возможно, на уровне модели предустановить для запрещенных или скрытых моделей. Например, удаление запрещенных экземпляров из области all, но также и области действия, такие как «последний» или когда запрашивается модель в целом. Или, если экземпляр вызван специально, который падает с запрещенной или скрытой областью, он поднимает запись, которая не найдена. Я все равно хотел бы иметь доступ к этим экземплярам через их отдельные области (например, User.banned или User.hidden), но я предпочел бы , что будет дополнительной типизацией, а не наиболее часто используемыми запросами.

ответ

2

Вам нужно определить некоторые области

default_scope joins(:status).where(:status => {:state => :active}) 
scope :hidden, unscoped.joins(:status).where(:status => {:state => :hidden}) 
+1

Вау спасибо! Мне, возможно, придется попробовать это завтра, когда жена сломает свой ноутбук и заставила мою машину смотреть Netflix. –

+0

Красивые, спасибо большое! –

+0

Быстрое примечание: использование соединения сделало модель только для чтения, поэтому я просто использовал 'where (: status_id => 1)' Это был 'default_scope', который спас мне жизнь, спасибо –

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