Ruby on rails 检查上次保存的忽略Object.new的项目

Ruby on rails 检查上次保存的忽略Object.new的项目,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个标准的Rails视图,在new.html.erb页面上的日期条件上显示一个警告框 <% if @user.items.last.issue_date + 2.years > Date.today %> ...show warning... <% end %> 看来我可以通过这样做来解决这个问题 <% if @user.items.offset(0).last.issue_date + 2.years > Date.today %>

我有一个标准的Rails视图,在
new.html.erb
页面上的日期条件上显示一个警告框

<% if @user.items.last.issue_date + 2.years > Date.today %>
  ...show warning...
<% end %>
看来我可以通过这样做来解决这个问题

<% if @user.items.offset(0).last.issue_date + 2.years > Date.today %>
Date.day%>
但这似乎根本不应该起作用,因为博士后的医生说

因此,我有两个问题:

  • 是否有更好的方法只检查保存在数据库中的记录
  • 为什么ActiveRecord偏移量调用行为(显然)与Postgres医生所说的应该是不同的

您在控制器中引入的新
@item
位于您的
@user.items
集合中,但尚未保存到数据库中

这就是添加
.offset(0)
对您有效的原因,因为与
.where()
子句一样,您正在将返回的记录的条件更改为仅从数据库返回的记录,而您的新记录不是其中之一

另一种过滤方法如下:

@user.items.reject(&:new_record?).last
@user.items.
  where('issue_date < ?', 2.years.ago).
  order(issue_date: :desc).
  limit(1).
  last
或者这个:

@user.items.reject { |item| item == @item }.last
但是,
.reject
的性能不如从数据库中提取大量数据或记录

否则,您所拥有的将起作用,但我将使用一个不那么脆弱(偏移量可能会改变)且更能揭示意图的查询,如下所示:

@user.items.reject(&:new_record?).last
@user.items.
  where('issue_date < ?', 2.years.ago).
  order(issue_date: :desc).
  limit(1).
  last

您在控制器中引入的新
@item
位于您的
@user.items
集合中,但尚未保存到数据库中

这就是添加
.offset(0)
对您有效的原因,因为与
.where()
子句一样,您正在将返回的记录的条件更改为仅从数据库返回的记录,而您的新记录不是其中之一

另一种过滤方法如下:

@user.items.reject(&:new_record?).last
@user.items.
  where('issue_date < ?', 2.years.ago).
  order(issue_date: :desc).
  limit(1).
  last
或者这个:

@user.items.reject { |item| item == @item }.last
但是,
.reject
的性能不如从数据库中提取大量数据或记录

否则,您所拥有的将起作用,但我将使用一个不那么脆弱(偏移量可能会改变)且更能揭示意图的查询,如下所示:

@user.items.reject(&:new_record?).last
@user.items.
  where('issue_date < ?', 2.years.ago).
  order(issue_date: :desc).
  limit(1).
  last

太好了,谢谢你的回答和增加的洞察力!太好了,谢谢你的回答和增加的洞察力!