Rails - find_by_sql - запрос с несколькими значениями для одного поля - PullRequest
2 голосов
/ 19 ноября 2010

У меня проблемы с объединением значений для запроса нескольких значений в один столбец. Вот что я получил до сих пор:

def self.showcars(cars)
    to_query = []
    if !cars.empty? 
      to_query.push cars
    end
    return self.find_by_sql(["SELECT * FROM cars WHERE car IN ( ? )"])
end

Это делает запрос в:

SELECT * FROM cars WHERE car IN (--- \n- \"honda\"\n- \"toyota\"\n')

Кажется, защита find_by_sql sql_injection добавляет дополнительные символы. Как мне заставить это работать?

Ответы [ 3 ]

4 голосов
/ 19 ноября 2010

Вам действительно нужно find_by_sql?Поскольку вы выполняете SELECT * и предполагаете, что ваш метод находится на модели Car, лучшим способом будет:

class Car < ActiveRecord::Base
  def self.showcars(*cars)
    where('car in :cars', :cars => cars)
    # or
    where(:car => cars)
  end
end

Обратите внимание на * сразу после имени параметра ...Используйте его, и вам не нужно будет писать код для преобразования одного параметра в массив.

Если вам действительно нужно find_by_sql, попробуйте написать его следующим образом:

def self.showcars(*cars)
  find_by_sql(['SELECT * FROM cars where car in (?)', cars])
end
0 голосов
/ 21 февраля 2016

Решение проблемы.

def self.average_time(time_init, time_end)

    query = <<-SQL
                 SELECT COUNT(*) FROM crawler_twitters AS twitter WHERE CAST(twitter.publish AS TIME) BETWEEN '#{time_init}' AND '#{time_end}'
                  GROUP BY user) AS total_tweets_time;
    SQL

    self.find_by_sql(sanitize_sql(query))
  end
0 голосов
/ 19 ноября 2010

Попробуйте объединить массив to_query в строку через запятую со всеми значениями в одинарных кавычках, а затем передать эту строку в качестве параметра "?".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...