2013-09-23 2 views
-1

Я пытаюсь выяснить, как rails преобразует хэш , например (Это пример, пожалуйста, не принимайте это буквально, я выбрал что-то вместе, чтобы получить концепцию, я знаю этот запрос такая же, как User.find (1)):rails 2.3 конвертировать хэш в mysql-запрос

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

в:. выбрать пользователей * FROM пользователей, где users.id = 1 ORDER BY имя пользователя

ближайший вещь, которую я могу найти ActiveRecord: : База # 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

Почему вы хотите использовать хэш здесь? Ваш запрос будет просто 'User.find (1)' в Rails. Btw. используя порядок, когда результат будет одним конкретным элементом, не имеет смысла. – 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 камень. Это было проверено только в моем текущем проекте, поэтому, если вы пытаетесь выполнить репликацию, помните об этом.

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