我想在活动记录模型之外生成部分查询,例如
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::FactoryMethods
Foo
,但这对我来说似乎很混乱。
Foo.new.to_arel
返回一个Arel::Nodes::NamedFunction
实例。调用to_sql
只有在存在数据库连接时才有效,正如我在尝试在无 Rails 测试中执行此操作时所注意到的那样。这是因为例如MySQL或Postgres连接可能会生成不同的SQL。