【发布时间】:2015-06-17 18:13:04
【问题描述】:
我有以下 SQL,它使用 WITH RECURSIVE 递归地获取记录的所有父项。在 Arel 中相当于什么?
table_name = self.class.table_name
arel_table = self.class.arel_table
sql = <<-SQL
WITH RECURSIVE a AS (
SELECT * FROM #{table_name} WHERE id = '#{id}'
UNION ALL
SELECT b.* FROM #{table_name} b
JOIN a ON b.id = a.parent_id
) SELECT id FROM a
SQL
ids = ActiveRecord::Base.connection.execute(sql).field_values('id')
ordering = ids.map { |id| arel_table[:id].eq(id) }
self.class.where(id: ids).order(ordering)
【问题讨论】:
-
我不知道 ActiveRecord 提供了一个很好的方法来做到这一点,但 Arel gem 包含一个
WITH RECURSIVE对其 SelectManager here 的测试。
标签: sql ruby activerecord arel