我正在使用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是列名。 Forex:如果列名x
是execution_date:DateTime,则f(x)可以是2^((execution_date * 1000) + 200)
,只是一些复杂的函数(是的,它真的很复杂!!)。
所以,现在想要根据那个复杂的函数返回值(这是一个DateTime)进行查询
查询列名很简单,我的问题是如何在自定义函数上进行查询。 (正如我上面提到的,可以使用lambda表达式进行选择查询。但是查询的位置是否可能?还有其他方法可以解决上述问题吗?)
答案 0 :(得分:1)
如果你不知道如何使用它,你就不需要sql函数。
forex:查找在时间t1和t2之间发送的所有订单
例如,您的模型Foo
包含列execution_date:date
。要查找foos
表格中execution_date
和t1
范围内t2
的所有记录,您必须使用下一个查询:
Foo.where('execution_date > ? OR execution date < ?', t1, t2)
此查询意味着我正在寻找foos表中的记录,其执行日期在执行时多于t1或小于t2&#39;