2014-10-19 3 views
3

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

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

Я хотел бы заменить find_by_sql заявления с вызовом AREL, но все примеры, я нашел require arel для работы со столом.

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

+0

Я думаю, что-то вроде 'AREL :: Узлов :: SqlLiteral.new («выберите move_to_end ...»)' – mdesantis

ответ

2

Вы можете сделать это, используя NamedFunctions в Ареле. Однако вам все равно придется использовать isl_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"; 
+0

Это работает ... пришлось переставить функция postgres немного. Благодаря! – TheDadman

Смежные вопросы