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
было бы достаточно