Как вызвать функцию postgres с помощью arel?

У меня есть функция Postgres с именем «move_to_end», которую я вызываю с помощью find_by_sql, как показано ниже:

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

Я хотел бы заменить оператор find_by_sql вызовом arel, но все примеры, которые я нашел, требуют, чтобы arel работал с таблицей.

Любые мысли о том, как это сделать, будут оценены.


person TheDadman    schedule 19.10.2014    source источник
comment
Я думаю что-то вроде Arel::Nodes::SqlLiteral.new('select move_to_end...')   -  person mdesantis    schedule 20.10.2014


Ответы (1)


Вы можете сделать это, используя NamedFunctions в Arel. . Однако вам все равно придется использовать 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";
person raeno    schedule 29.10.2014
comment
Это работает... пришлось немного изменить функцию postgres. Спасибо! - person TheDadman; 30.10.2014