SQL или AREL запрос по методу в рельсах - PullRequest
0 голосов
/ 26 сентября 2018

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

openings = Opening.joins(:opening_number).where('opening_numbers.value = ?', value)

Однако теперь мне нужно искать по методу.Например, вот метод в модели OpeningNumber:

def to_s
  value || sprintf("%03d", id % 1000)
end

Затем я хочу выполнить поиск по результату этого метода.Я не знаю, как это сделать через sql или arel.Что я могу сделать, это:

openings = Opening.includes(:opening_number)
  .select { |opening| opening.opening_number.to_s == value }

Однако, это намного медленнее, чем SQL-запрос, и это вызывает проблемы с производительностью.

Кто-нибудь знает, как это сделать с помощью SQL или Arel?Или, если нет, как повысить производительность, например, SQL-запрос?

В прошлом он использовал ferrets и mysql, чтобы его можно было проиндексировать и выполнить поиск.Но недавно мы перенесли mysql в postgresql и удалили ferrets.

1 Ответ

0 голосов
/ 26 сентября 2018

Таким образом, вы в основном спрашиваете, как реализовать value || (id % 1000).print_using("%03d") логику в выражении sql where?

Прямой подход будет следующим:

Opening.includes(:opening_number).where("opening_numbers.value = ? OR (format('%03d', (opening_numbers.id % 1000)::string))::integer = ?", value).references(:opening_numbers)

Также проверьте, нужно ли вам все еще использовать includes.Просто для этого случая joins будет достаточно

...