Проблема с сортировкой по строке (особый случай) - PullRequest
0 голосов
/ 05 августа 2011

У меня есть требование для сортировки записей контактов по primary_contact_no.
Поля «Мой контакт» содержат имя_первого_контакта, адрес электронной почты, номер_почты.

это не умнее ....

НО мой взгляд требует, чтобы я показывал mobile_no под Контактный номер (просмотреть метку), когда primary_contact_no отсутствует.

Contacts.find(:all, :order => "primary_contact_no")

Теперь, когда я сортирую его по primary_contact , в представлении записи, в которых эти поля отсутствуют, заменяются на mobile_no , но так как они уже отсортированы по contact_no, они появляются в нижняя часть результатов поиска.

Как мне объединить два результата (если primary_contact отсутствует и выполнить поиск по объединенной записи)

Есть ли другое решение проблемы, где я могу объединить записи поиска строк или что-то подобное ???

P.S. Я использовал будет разбивать на страницы .

Ответы [ 2 ]

1 голос
/ 05 августа 2011

MySQL и PostgreSQL имеют функцию COALESCE, поэтому вы можете сделать что-то вроде:

Contacts.find(:all, :order => "COALESCE(primary_contact_no,mobile_no)")

для сортировки записей, как вы хотите. Но будьте осторожны, используя функции sql и raw sql, есть свои предостережения. Если вы решите переключить базы данных, вы должны проверить, поддерживаются ли в вашем новом RDBMSI все необработанные функции sql и sql, которые вы использовали подобным образом.

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

1 голос
/ 05 августа 2011

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

Итак

contacts = Contact.all
u.sort!{|a,b| a.con_number<=> b.con_number}

Тогда в вашей контактной модели

def con_number
  primary_contact_no||mobile_no
end
...