Новый @item
, созданный вами в контроллере, находится в вашей коллекции @user.items
, но еще не сохранен в базе данных.
Именно поэтому добавление .offset(0)
работает для вас,потому что, подобно предложению .where()
, вы изменяете условия возвращаемых записей только на те, которые возвращены из базы данных, из которых ваша новая запись не является одной из.
Альтернативаспособ отфильтровать это может выглядеть следующим образом:
@user.items.reject(&:new_record?).last
Или это:
@user.items.reject { |item| item == @item }.last
Однако .reject
будет менее производительным, чем извлечение из базы данных для большого числа илиrecords.
В противном случае то, что у вас есть, работает, но я бы использовал менее хрупкий (смещения могут измениться) и более откровенный запрос, например:
@user.items.
where('issue_date < ?', 2.years.ago).
order(issue_date: :desc).
limit(1).
last
И в идеале вы можетеоберните это в User
метод запроса или область действия в модели с именем что-то вроде @user.issues.expired
или @user.issued_less_than(2.years.ago)
, или что-то еще, что работает для вашего приложения.
Кроме того, я надеюсь, что @user.items
заказан наотношения, потому что Postgres не всеспособы возврата товаров в любом конкретном порядке, если вы не укажете один.
has_many :items, -> { order(id: :desc) }