Пользовательский рейтинг на основе нескольких критериев в Rails - PullRequest
0 голосов
/ 22 ноября 2018

Мне нужно ранжировать записи в таблице базы данных на основе двух столбцов:

Availability_date

и

updated_at

Оба они являются столбцами типа дата-время, но условия для ранжирования не являются линейными по времени.Так, например, в шкале от 0 до 10 значения updated_at:

от 14 до 30 дней назад получат 10,

, тогда как от 13 до 9 дней назад получат 9,5,

от 31 до 60 получит 9,

и т. Д.

То же самое относится к столбцу «Availability_date».

Окончательный рейтинг / результат заказадолжно быть средним значением обеих шкал для каждой записи.

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

Я использую Ruby 2.5.1 и Rails 5.2.

Кто-нибудь знает, возможно ли это?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 22 ноября 2018

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

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

Я могу представить себе что-то вроде:

def date_to_val(date)
  days_ago = (Time.now - date).to_i / 1.day
  return 10 if days_ago.between?(14, 30)
  return 9.5 if days_ago.between?(9, 13)
  return 9 if days_ago.between?(31, 60)
  # and so on
end

def my_controller_action
  @records = SomeClass.where(some_attr: some_val)
  ordered = @records.sort_by do |e| 
    [
      date_to_val(e.created_at), 
      date_to_val(e.availability_date)
    ].sum / 2.0
  end
  # do something with ordered
end

Теперь, если вы хотите сделать это чисто с запросами SQL, то это другоевопрос.

...