如何将SQL字符串解析为Rails Arel对象

5

之前我写了一些大而复杂的SQL语句,然后询问过如何在Rails中更好地处理它们。但是最终我还是用了Arel,因为如果我使用"find_by_sql",就无法嵌套更多条件。

Questions.find_by_sql(HUGE_SQL).by_filter(:popular).order('created_at').limit(5)

我的目标是:

  • 将SQL语句整理到单独的文件中
  • 将这些字符串SQL语句转换为Arel对象
  • 将该Arel对象与常见的可重用条件(如“limit,order”等)嵌套

谢谢。


Arel目前只是一种单向库。我不知道有什么可以解析和创建Arel树的工具。 - Dmitry Polushkin
2个回答

0
解决方案是使用神奇的scuttle.io将复杂的SQL查询转换为Arel。然后,您可以为查询的每个部分创建单独的方法,仍然能够将它们组合在一起。更多详细信息请见presentation

0
我需要这样一个东西,以便我可以从 Web 仪表板中获取筛选范围,并将其传递给后台任务,使用相同的范围生成 CSV 导出。以下是我的解决方案:
def sql_to_scope(model_class, sql)
  model_class.from("(#{sql}) as \"#{model_class.table_name}\"")
end

给定一个 Customer 模型:

sql_to_scope(Customer, Customer.where('id % 2 = 0').to_sql).find_each { |c| puts c.id }
# 2
# 4
# 6

sql_to_scope(Customer, "select * from customers where id % 2 = 0").pluck(:id)
# => [2, 6, 4]

它的工作原理是用包含原始SQL的子查询替换默认的FROM子句。如果在更复杂的情况下出现问题,我不会感到惊讶,但对于我的简单需求来说,它是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接