Rails 4 where 并使用自定义功能选择查询
Posted
技术标签:
【中文标题】Rails 4 where 并使用自定义功能选择查询【英文标题】:Rails 4 where and select query with custom function 【发布时间】: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 返回)。
【参考方案1】:
如果你不知道如何使用它,你不需要 sql 函数。
外汇:查找在时间 t1 和 t2 之间发送的所有订单
例如,您有模型Foo
与列execution_date:date
。要在foos
表中查找execution_date
在t1
和t2
范围内的所有记录,您必须使用下一个查询:
Foo.where('execution_date > ? OR execution date < ?', t1, t2)
这个查询的意思是'我正在寻找 foos 表中的记录,这些记录的执行日期大于 t1 或小于 t2'
【讨论】:
我编辑了帖子以使其更加清晰。对列名进行查询很容易。问题是在自定义函数上触发它,比如function(Foo.execution_date)
,如果 execution_date 是列。以上是关于Rails 4 where 并使用自定义功能选择查询的主要内容,如果未能解决你的问题,请参考以下文章