【发布时间】:2016-01-14 12:18:00
【问题描述】:
我正在使用 Rails 4,并且有一个类似这样的表结构:
Order(id: integer, ..., created_at: datetime, states_time: string)
现在我想根据 states_time, forex: 查询上表,以查找在时间 t1 和 t2 之间调度的所有订单。给定,可以使用函数get_dispatch_time(x) 计算调度时间。
希望最终查询应该是这样的:
Order.all.where(get_dipatch_time: t1..t2) # WRONG SYNTAX
类似:
Order.all.where(created_at: t1..t2)
我可以使用select 查询和 lamda 表达式来获取这些数据,但问题是它会返回 ActiveRecord 对象数组,而不是 ActiveRecord::Relation,因此无法执行进一步的查询(分页查询)在它上面。
Order.all.select{ |o| get_dispatch_time(o) > t1 && get_dispatch_time(o) < t2 }
=> #[#<Order id: 10, ship_by: ....>, #<Order id: 2, ..> ]
但是,所需的结果应该是:
=> #<ActiveRecord::Relation [#<Order id: 10, ship_by: ....>, #<Order id: 2, ..> ]>
主要问题是只能通过 ActiveRecord::Relation 链接查询。外汇:Order.where(...).order(...).sort(...).limit(...)
谁能帮帮我:
- 如何在
where查询中使用自定义方法,返回ActiveRecord::Relation? 或 - 如何在
select查询之间应用查询链?
编辑
一些说明:
get_dispatch_time(x) 是一个 Ruby 函数。
我需要根据一些自定义函数 f(x) 过滤数据,其中 x 是列名。外汇:如果列名
x是 execution_date:DateTime,则 f(x) 可以类似于2^((execution_date * 1000) + 200),只是一些复杂的函数(是的,它真的很复杂!!)。 所以,现在想根据那个复杂的函数返回值(即一个DateTime)进行查询查询列名很容易,我的问题是如何查询自定义函数。 (可以使用 lambda 表达式进行 select 查询,如上所述。但是 where 查询也可以吗?还有其他方法可以解决上述问题吗?)
【问题讨论】:
-
你的 get_dispatch_time 函数是做什么的?你能以某种方式在 SQL 中模仿它的行为吗?
-
get_dispatch_time是 SQL 函数还是 Ruby 函数?你能把它包括在问题中吗? -
get_dispatch_time是一个 Ruby 函数(基本概述:它遍历 JSON 字符串化字符串(多次字符串化)并在 epoch 字符串中获取适当的时间,然后将其作为 DateTime 返回)。
标签: sql ruby-on-rails ruby postgresql ruby-on-rails-4