我真的很诧异用Arel建立单个复合sql查询,当发现Arel的东西是不可链的。
经过长时间的搜索,我找到了一个单一的解决方案,它使用'反射'自定义方法,想法是递归实例化新的sql查询。它使用了'reflect'自定义方法,想法是递归实例化新的构建器类。没有问题。
例如,我是如何尝试的。
e = Arel::Table.new(:events)
a = e.where(e[:id].eq(1))
if (smth) { a.where(e[:name].eq('joe')) } # not works
不可能以某种方式把它连在一起 我的计划被打乱了。好吧,我已经手动实现了。
然而,这不是一个好主意,因为我应该防止任何sql-injections陷阱,等等。
e.where(e[:id].eq(1).and(e[:name].eq('joe'))
不过我真的不明白你为什么要用Arel,因为这是用ActiveRecord查询接口的琐碎任务。
Event.where(id: 1, name: 'joe')
# calls to merge are additive
Event.where(id: 1).where(name: 'joe')
# you can also programmatically merge scopes together
Event.where(id: 1).merge(Event.where(name: 'joe'))