如何使用arel调用postgres函数?

时间:2014-10-19 21:18:06

标签: ruby-on-rails rails-activerecord arel

我有一个名为'move_to_end'的Postgres函数,我正在使用find_by_sql调用,如下所示:

def move_to_end
  self.class.find_by_sql ["select move_to_end(?)", id]
end

我想用arel调用替换find_by_sql语句,但我发现的所有示例都需要使用表来处理。

任何有关如何实现这一目标的想法都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

您可以在Arel中使用NamedFunctions来完成此操作。 但是,您仍然必须使用arel_table来引用查询中的表列。一种可能的解决方法是使用下划线对其进行别名:

# == Schema Information
#
# Table name: solution
#
#  solution_id    :integer          not null, primary key
#  body    :text
#
class Solution
  class << self
    alias_method :_, :arel_table

    def only_checked
        _.project(checked(_[:solution_id]))
    end

    def checked
        Arel::Nodes::NamedFunction.new('CHECKED', [query])
    end
  end
end 

Solution.only_checked.to_sql # -> SELECT CHECKED("solution"."solution_id") FROM "solution";