Рельсы где основаны на ассоциации - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь запросить элементы, основанные на ассоциации, но немного путаюсь с тем, как сформулировать часть даты в моем запросе.Даты хранятся в текстовом формате, например, "2018-12-25".

year = params[:ridden_in]
@items = Item.joins(:cycle).where(cycles: { (:date.to_date).year: year })

Кто-нибудь может помочь, где я иду не так?

1 Ответ

0 голосов
/ 28 декабря 2018

Самый простой способ сделать это - использовать функции 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 (то есть индексировать результат любой функции, которую вы в конечном итоге используете).

...