如何在 Arel 中创建和使用未绑定到列的函数?

How do you create and use functions in Arel that are not bound to a column?

假设我要创建:

SELECT * FROM memberships WHERE memberships.expires < NOW()

我尝试过:

fn = Arel::Nodes::Function.new("NOW")
memberships = Arel::Table.new("memberships")
memberships.project(Arel.star).where(
  memberships[:expires].lt(fn)
)

其中给出TypeError (Cannot visit Arel::Nodes::Function).

我在刚刚介绍使用 Arel::Nodes::NamedFunction 创建绑定到特定属性的函数时找到的所有资源。我知道还有其他方法可以解决这个问题,比如 sql 文字,但我很好奇如何实际使用 Arel::Nodes::Function.

您可以使用 Arel::Nodes::NamedFunction.

此 class 使用函数名称和参数数组进行初始化。 NamedFunction 的访问者将 assemble SQL 作为 FUNCTION_NAME(comma, separated, arguments).

由于 NOW 没有参数,我们需要做的就是传递一个空参数数组。

fn = Arel::Nodes::NamedFunction.new("NOW",[]) 
memberships = Arel::Table.new("memberships")
memberships.project(Arel.star).where(
  memberships[:expires].lt(fn)
).to_sql 
#=> "SELECT * FROM [memberships] WHERE [memberships].[expires] < NOW()"

Function 似乎是仅用于继承目的的超级 class,子级包括 SumExistsMinMax ,Avg, 和 NamedFunction(允许您按名称调用任何其他函数,如上所示)