Как мне написать произвольные SQL-запросы в Ruby on Rails? - PullRequest
3 голосов
/ 16 марта 2012

Я как бы учусь, но не могу понять это. Все мои текущие запросы - что-то вроде MyObject.find(various conditions). Это возвращает массив MyObject s, и этого достаточно для большинства целей. Но сейчас я хочу создать список самых популярных предметов с запросом типа select name, count(*) from MyObjects group by name order by 2. Это не собирается возвращать MyObject s, это будет возвращать произвольные столбцы данных. Так как мне это сделать?

Ответы [ 4 ]

5 голосов
/ 16 марта 2012

Если вы используете MyObject.find_by_sql, это должно решить ваши проблемы.Любые дополнительные столбцы, которые вы используете в операторе select, могут быть доступны как обычно через возвращаемый объект.Например,

    MyModelName.find_by_sql("select coulmn1, column2 as somenewname,
    column3 as someothername from....")

Возвращает объекты, каждый из которых будет иметь атрибуты, называемые somenewname и someothername.

Более подробную информацию о методе find_by_sql можно найти в документации.

2 голосов
/ 16 марта 2012

Вы можете сделать что-то простое с помощью стандартного интерфейса запросов ActiveRecord:

results = MyObject.select('name, count(*) as how_many')
                  .group(:name)
                  .order(:how_many)

# And later...
results.each do |o|
    puts "#{o.name} has #{o.how_many}"
end

, поэтому вам не придется прибегать к SQL.

Как уже упоминалось, есть и другие.find_by_sql, если вы хотите использовать SQL-запрос для создания экземпляра набора объектов модели на основе SQL-запроса.

Если у вас есть какой-либо SQL-запрос, который собирает данные из нескольких таблиц или содержит вещи, которые AR не поддерживаетхорошо (подвыборы, производные таблицы, ...), тогда вы можете отодвинуть ActiveRecord и поговорить напрямую с базой данных:

connection.select_rows('some big pile of sql').each do |r|
    # r will be an array of strings so you have to pull
    # it apart and sort out the types by hand
end

Использование select_rows также может быть полезно, если выкодирует большую кучу данных прямо в JSON (или аналогичную) и не нуждается в тонкостях ActiveRecord и не хочет оплачивать накладные расходы при использовании ActiveRecord.

0 голосов
/ 16 марта 2012

Вы можете попробовать orm-way

MyObject.select(:name, "count(*) as count").group(...).order(...)
0 голосов
/ 16 марта 2012

Вы всегда можете:

MyObject.find_by_sql('query....')

но обычно есть лучшие способы.

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