如何在活动记录之外使用像"合并"这样的 Arel 方法?



我想在活动记录模型之外生成部分查询,例如

class Foo
def to_arel
coalesce(1, 2)
end
end

我可以通过一些现有的模型,但这是不优雅的:

Item.arel_table.coalesce(1, 2).to_sql # => "COALESCE(1, 2)"

有什么更好的方法?

(这个项目目前在Rails 6.1上,但我也对新版本的解决方案感兴趣。

这是我想到的:

class Foo
def to_arel
arel.coalesce(1, 2)
end
private
def arel
@arel ||= Class.new.extend(Arel::FactoryMethods)
end
end

(我也可以直接include Arel::FactoryMethodsFoo,但这对我来说似乎很混乱。

Foo.new.to_arel返回一个Arel::Nodes::NamedFunction实例。调用to_sql只有在存在数据库连接时才有效,正如我在尝试在无 Rails 测试中执行此操作时所注意到的那样。这是因为例如MySQL或Postgres连接可能会生成不同的SQL。

最新更新