Самый простой способ сделать это - использовать функции SQL.Вы могли бы попытаться скрыть SQL за AREL, но это очень быстро становится непонятным беспорядком.
Одним из способов будет прямая манипулирование строками:
Item.joins(:cycle).where('substring(cycles."date" from 1 for 4) = ?', year)
или чуть более перспективно на будущее с момента вашей датыв конечном итоге станет реальной датой:
Item.joins(:cycle).where('extract(year from cycles."date"::date) = ?', year)
Item.joins(:cycle).where('extract(year from cast(cycles."date" as date)) = ?', year)
Оба они предполагают, что ваши date
столбцы действительно соответствуют формату даты ISO8601.
Если вы делаете это много, то выможет добавить частичный индекс на cycles.date
(то есть индексировать результат любой функции, которую вы в конечном итоге используете).