无法获得预订

时间:2014-07-24 00:58:29

标签: ruby-on-rails ruby ruby-on-rails-4

Basicaly我有预订模型和产品型号。我正在尝试计算Date.today上的预订,但问题是,如果我这样做:

def self.new_reservations_count
   where("canceled = ? and starts_at = ?", false, Date.today).count
end

返回0因为starts_at不在那里,而是我试图获取的产品的starts_at,但每当我这样做时,我得到一个sql错误。

每当您通过产品进行预订时,我都会使用collection_select获取产品信息并在预订视图中使用reservation.product.starts_at,名称等进行调用...

<%= f.collection_select :product_id, Product.where("starts_at > ?", Time.now), :id, :starts_at, { include_blank: "Select a time"}, class: 'form-control' %>

我希望能够将product.starts_at分配给reservation.starts_at,以便我可以调用上述函数。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

查询日期通常有效的方法是使用BETWEEN或将字段和查询值都转换为DATE

使用between

Product.where(starts_at: Time.now.beginning_of_day..Time.now.end_of_day)

这会在Productstart_at的{​​{1}}之间找到datetimedatetime的所有beginning_of_day

end_of_day传递给ActiveRecord会使其使用SQL Range运算符:

BETWEEN

转换为SELECT "products".* FROM "products" WHERE ("products"."starts_at" BETWEEN '2014-07-24 00:00:00.000000' AND '2014-07-24 23:59:59.999999')

DATE

由于Product.where("DATE(starts_at) = ?", Date.today) 不包含时间信息,因此它会显示为Date.today,因此我们必须将2014-07-24字段datetime转换为日期,否则它不会完全匹配:

starts_at

要修复您的方法,您需要将产品表与预订表一起加入,并在引用SELECT "products".* FROM "products" WHERE (DATE(starts_at) = '2014-07-24') 列时特定于表格:

starts_at