2014-10-19 74 views
3

我稱之爲「move_to_end」我使用的find_by_sql如下調用Postgres的功能:如何使用arel調用postgres函數?

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

我想更換一個AREL調用的find_by_sql聲明,但所有的例子,我發現要求arel與桌子一起工作。

有關如何完成此任何想法,將不勝感激。

+0

我覺得像'阿雷爾::節點:: SqlLiteral.new(「選擇move_to_end ...」)' – mdesantis 2014-10-19 22:03:59

回答

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"; 
+0

這一工程......不得不重新安排postgres功能有點。謝謝! – TheDadman 2014-10-30 18:08:04