Как да извикам функция 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, но всички примери, които открих, изискват да работят с таблица.

Всякакви мисли за това как да се постигне това ще бъдат оценени.


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 . Все пак трябва да използвате are_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