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,以便我可以调用上述函数。
有没有办法做到这一点?
答案 0 :(得分:0)
查询日期通常有效的方法是使用BETWEEN
或将字段和查询值都转换为DATE
使用between
:
Product.where(starts_at: Time.now.beginning_of_day..Time.now.end_of_day)
这会在Product
和start_at
的{{1}}之间找到datetime
为datetime
的所有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