SQL или AREL запрос по методу в рельсах

В рельсах, если я хочу найти столбец в таблице, мне просто нужно сделать 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 ответ

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

Прямой подход будет:

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

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

Другие вопросы по тегам