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_datet1t2 范围内的所有记录,您必须使用下一个查询:

Foo.where('execution_date > ? OR execution date < ?', t1, t2)

这个查询的意思是'我正在寻找 foos 表中的记录,这些记录的执行日期大于 t1 或小于 t2'

【讨论】:

我编辑了帖子以使其更加清晰。对列名进行查询很容易。问题是在自定义函数上触发它,比如 function(Foo.execution_date),如果 execution_date 是列。

以上是关于Rails 4 where 并使用自定义功能选择查询的主要内容,如果未能解决你的问题,请参考以下文章

开发技巧--自定义功能按钮开发

检测chrome浏览器,并执行自定义功能[重复]

WordPress 创建自定义功能

使用带有扩展和自定义功能的 groupby

每个系列的 Pandas groupby 自定义功能

我可以使用 DRF 重新创建 ORO CRM API 来为我的项目获取自定义功能吗