Rails 4在哪里和选择查询与自定义功能

时间:2016-01-14 12:18:00

标签: sql ruby-on-rails ruby postgresql ruby-on-rails-4

我正在使用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(...)

有人可以帮助我:

  1. 如何使用where查询自定义方法,返回ActiveRecord :: Relation?
  2. 如何在中间使用select查询来应用查询链?
  3. 修改

    一些澄清:

    1. get_dispatch_time(x)是一个Ruby函数。

    2. 我需要根据一些自定义函数f(x)过滤数据,其中x是列名。 Forex:如果列名x是execution_date:DateTime,则f(x)可以是2^((execution_date * 1000) + 200),只是一些复杂的函数(是的,它真的很复杂!!)。 所以,现在想要根据那个复杂的函数返回值(这是一个DateTime)进行查询

    3. 查询列名很简单,我的问题是如何在自定义函数上进行查询。 (正如我上面提到的,可以使用lambda表达式进行选择查询。但是查询的位置是否可能?还有其他方法可以解决上述问题吗?)

1 个答案:

答案 0 :(得分:1)

如果你不知道如何使用它,你就不需要sql函数。

  

forex:查找在时间t1和t2之间发送的所有订单

例如,您的模型Foo包含列execution_date:date。要查找foos表格中execution_datet1范围内t2的所有记录,您必须使用下一个查询:

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

此查询意味着我正在寻找foos表中的记录,其执行日期在执行时多于t1或小于t2&#39;