Использование оператора SELECT CASE в ActiveRecord в качестве модели Rails default_scope - PullRequest
0 голосов
/ 03 октября 2011

У меня есть модель User, которая может быть индивидуальной или корпоративной, в зависимости от логического значения, is_company. Если пользователь является компанией, company_name сохраняет имя; если пользователь - физическое лицо, first_name и last_name сохраняют свое имя.

В подавляющем большинстве случаев я хочу, чтобы пользователи сортировались по last_name ИЛИ company_name по умолчанию, поэтому я использую default_scope в своей модели User.

Однако то, как я это понимаю, даже при том, что оно работает для SQLLite, не зависит от базы данных. Может кто-нибудь дать мне знать, как я могу реорганизовать это, чтобы принять параметр "true" в выражении case?

default_scope select('users.*')
default_scope select('CASE WHEN is_company = "t" THEN company_name ELSE last_name END AS sort_name')
default_scope order('sort_name ASC')

Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Вам нужно переосмыслить свой дизайн. Пользователь, который может быть компанией, не звучит как хороший дизайн для меня. Я думаю, что вам лучше с отдельными User и Company моделями.

Таким образом, ваша сортировка будет намного проще ..

0 голосов
/ 03 октября 2011

Возможно, вы захотите сделать скромный редизайн, чтобы справиться с этим во время записи в базу данных.

  • Создайте новый столбец в вашей таблице пользователей для display_name
  • Создайте обратный вызов before_save в вашей модели пользователя, который задает отображаемое имя как:

    before_save :set_display_name
    
    def set_display_name
     self.display_name = self.is_company? ? self.company_name : self.last_name 
    end
    
  • Измените ваш default_scope на порядок по новому столбцу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...