【发布时间】:2017-06-22 09:56:28
【问题描述】:
在构建查询方面需要一些帮助。我在bookings 表和booking_versions 表之间存在一对多的关系。每次预订状态更改时,都会生成一个新的booking_versions 行,其中指定了status 和created_at 列。我的目标是获得状态状态更改之间的最短持续时间。这是我从现在开始尝试的方法
def self.min( filter )
query = <<-SQL
SELECT bv1.item_id AS 'obj_id', MIN(
bv2.created_at - bv1.created_at) AS 'mintime'
FROM bus_booking_versions AS bv1
INNER JOIN bus_booking_versions AS bv2
ON bv1.item_id = bv2.item_id
WHERE bv1.status = ?
AND bv1.created_at >= ?
AND bv1.created_at <= ?
AND bv2.status IN (?)
AND bv2.created_at >= ?
AND bv2.created_at <= ?
SQL
self.find_by_sql([query, filter.start_status, filter.from_start, filter.to_start, filter.end_statuses, filter.from_end, filter.to_end])
end
那是 Rails 代码,它仍然使用纯 sql。此查询无法正常工作。可能您可以建议如何获得运行最短时间()的预订。
巴士预订版本架构(item_id 是预订的外键)
create_table "bus_booking_versions", force: :cascade do |t|
t.string "item_type", limit: 255, null: false
t.integer "item_id", limit: 4, null: false
t.string "event", limit: 255, null: false
t.string "whodunnit", limit: 255
t.text "object", limit: 4294967295
t.datetime "created_at"
t.integer "status", limit: 4
end
paper tail gem 以这种方式创建版本
has_paper_trail on: [:create, :update],
class_name: "Bus::BookingVersion",
meta: { status: Proc.new { |t| t.status if t.status_changed? } }
【问题讨论】:
-
如果您要添加表结构和具有预期输出的两三个样本数据,这将很容易提供帮助。
-
提示:您可以添加数据库标签,提供预期结果示例,您将有机会从 dba 中获得答案。
标签: sql ruby-on-rails activerecord orm