ActiveRecord: упорядочить по firstcolumn, (secondcolumn = 'foobar'), третьему столбцу ... возможно? - PullRequest
2 голосов
/ 16 ноября 2010

У меня есть запрос activerecord, который работает следующим образом:

Пользователь ищет почтовый индекс - скажем, 90210. Затем запрос идентифицирует штат (Калифорния) и возвращает все результаты, которые совпадают либо вполе 'zipcode' или поле 'state'.

Я бы хотел сначала упорядочить результаты, которые точно соответствуют точному почтовому индексу.Таким образом, результаты с точным почтовым индексом «90210» будут оцениваться выше, чем результаты, которые просто удовлетворяют «Калифорнии» в качестве штата ... имейте в виду, что результаты с почтовым индексом 90210 могут также иметь в качестве штата «Калифорния».1006 * Есть предложения?

1 Ответ

2 голосов
/ 16 ноября 2010

Вы не говорите, какие dmbs вы используете - в msysql вы можете сделать условный порядок, например

:order => "IF(zipcode = '#{params[:zipcode]}', 0, 1)"

Другие dbms могут делать это по-другому, хотя я думаю, что это стандартно. Альтернативный способ сделать это -

 :order => "(zipcode = '#{params[:zipcode]}') desc)"

Описание desc просто необходимо, потому что тест if, неявный в приведенном выше, возвращает 1 для true и 0 для false, а 1 следует после 0, поэтому истинные результаты следуют после false. Отсюда desc, чтобы подтолкнуть истинных к вершине.

Я немного смущен тем, что именно ты хочешь делать. Если вы хотите найти все результаты, в которых состояние или почтовый индекс совпадает с параметрами [: zipcode], но переместите те, которые соответствуют почтовому индексу, на верх, это будет

YourModel.find(:all, 
  :conditions => ["zipcode = ? or state = ?", params[:zipcode], params[:zipcode]], 
  :order => "IF(zipcode = '#{params[:zipcode]}', 0, 1)")

Если вы хотите сначала упорядочить по другим столбцам (в соответствии с заголовком сообщения), просто поставьте их перед вызовом IF в опции заказа, например,

:order => "name, IF(zipcode = '#{params[:zipcode]}', 0, 1), zipcode"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...