2013-09-23 37 views
-1

我在試圖找出導軌如何轉換哈希(這是一個例子,請不要把這個字面意思我把東西扔在一起,我知道這個查詢得到的概念相同User.find(1)):rails 2.3將哈希轉換爲mysql查詢

{ 
    :select => "users.*", 
    :conditions => "users.id = 1", 
    :order => "username" 
} 

進入: SELECT用戶* FROM用戶那裏users.id = 1個ORDER BY用戶名

我能找到最接近的是ActiveRecord的: :Base#find_every

def find_every(options) 
    begin 
    case from = options[:from] 
    when Symbol 
     instantiate_collection(get(from, options[:params])) 
    when String 
     path = "#{from}#{query_string(options[:params])}" 
     instantiate_collection(format.decode(connection.get(path, headers).body) || []) 
    else 
     prefix_options, query_options = split_options(options[:params]) 
     path = collection_path(prefix_options, query_options) 
     instantiate_collection((format.decode(connection.get(path, headers).body) || []), prefix_options) 
    end 
    rescue ActiveResource::ResourceNotFound 
    # Swallowing ResourceNotFound exceptions and return nil - as per 
    # ActiveRecord. 
    nil 
    end 
end 

我不確定如何修改它只返回原始mysql語句。

+0

爲什麼你想在這裏使用散列?你的查詢在Rails中只是'User.find(1)'。順便說一句。當結果是一個特定的項目時使用一個命令是沒有意義的。 – spickermann

+0

這是真的,但它不包括我有問題。我使用paginate,最近我不得不使用HAVING關鍵字。不幸的是,我的分組結果在select中被指定,它被will_paginate銷燬。但是,如果我能得到上述工作,我可以調用paginate_by_sql這將包裝查詢並返回正確的計數結果。 – Camway

回答

0

所以經過幾個小時的挖掘,我想出了一個答案,雖然它不是很好。

class ActiveRecord::Base 
    def self._get_finder_options options 
    _get_construct_finder_sql(options) 
    end 

    private 
    def self._get_construct_finder_sql(options) 
    return (construct_finder_sql(options).inspect) 
    end 
end 

添加此作爲擴展爲您提供了一個可公開訪問的方法_get_finder_options返回原始SQL語句。

在我而言,這是一個複雜的查詢被包裝成這樣

SELECT COUNT(*) as count FROM (INSERT_QUERY) as count_table 

所以,我仍然可以利用此功能will_paginate gem是。這只是在我目前的項目中進行過測試,所以如果您嘗試複製,請記住這一點。