Rails применяет условие в sort_by, ища значение - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над сортировкой списка сотрудников по их названию со следующим:

TAGS = {
'Region Manager' => 1,
'Region Sales Manager' => 2,
'General Manager' => 3,
'Residential Sales Manager' => 4,
'Commercial Sales Manager' => 5,
'Other' => 6
}.freeze

def sorting_by_title(employees)
 employees.sort_by do |x|
   TAGS[x[:title]]
 end
end

Работает нормально, но ... Мне также нужно сделать дополнительную сортировку, если фамилия сотрудника - Смити должен идти перед другими людьми.

Поэтому я попытался сделать что-то вроде:

return TAGS[x[:title]] unless x.last_name == "Smith"

Не работает.Это ошибка на странице показа с неопределенным методом `each 'для 2: целое число.

Поэтому я подумал, что я должен создать другой метод для поиска фамилии.

def nepotism(employees)
 employees.group_by do |emp|
   case emp.last_name
   when /Smith/ then :moocher
   end
 end
end

Поэтому я попытался ссылаться на него так:

return TAGS[x[:title]] unless x.nepotism
return TAGS[x[:title]] unless x.moocher

Ни одна из этих работ.Непотизм заканчивается неопределенным методом `nepotism 'для #, а Moocher заканчивается тем же.Тогда я понял, что простой запрос будет работать немного лучше:

def nepotism
 @nepotism = Employee.where(last_name: "Smith")
end

Есть ли лучший способ сортировки по фамилии, если он соответствует Смиту и ТО по тегам?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Объедините их вот так

employees.sort_by do |x|
  x.last_name == "Smith" ? 0 : TAGS[x[:title]]
end

Вы также можете сделать это в базе данных (если Postgresql здесь)

def nepotism
  tagstring = "array_position(ARRAY"+TAGS.keys.to_s.gsub(/\"/,"'")+", last_name)"
  @nepotism = Employee.order("last_name = 'Smith' desc, " + tagstring)
end
0 голосов
/ 28 декабря 2018

Вот хороший трюк: в ruby ​​вы можете сравнивать массивы.И, следовательно, используйте их в качестве значения в sort_by.Они сравниваются поэлементно.Если ary1[0] < ary2[0], то ary1 будет меньше, чем ary2, независимо от остальных элементов.

 employees.sort_by do |x|
   [
     x.last_name == "Smith" ? 0 : 1, # all zeroes come before all ones
     TAGS[x[:title]] # your main ordering parameter
   ]
 end

Это сработало бы очень хорошо, если бы было много кузнецов, и вам нужно было отсортировать их по названиям междусамих себя.Если есть только один Смит, то решение @ Björn проще.

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