Я использую sql-запросы в своем коде rails, который необходимо перевести на Active Record Query. Я раньше не использовал Active Record, поэтому попробовал выполнить http://guides.rubyonrails.org/active_record_querying. html, чтобы получить правильный синтаксис, позволяющий переключиться на этот метод получения данных. Я могу преобразовать простые запросы в этот формат, но есть и другие сложные запросы, например

SELECT b.owner, 
       Sum(a.idle_total), 
       Sum(a.idle_monthly_usage) 
FROM   market_place_idle_hosts_summaries a, 
       (SELECT DISTINCT owner, 
                        hostclass, 
                        week_number 
        FROM   market_place_idle_hosts_details 
        WHERE  week_number = '#{week_num}' 
               AND Year(updated_at) = '#{year_num}') b 
WHERE  a.hostclass = b.hostclass 
       AND a.week_number = b.week_number 
       AND Year(updated_at) = '#{year_num}' 
GROUP  BY b.owner 
ORDER  BY Sum(a.idle_monthly_usage) DESC 

Которые мне нужны в формате Active Record, но из-за сложности я застрял в том, как продолжить преобразование.

Результат запроса выглядит примерно так

+----------+-------------------+---------------------------+
| owner    | sum(a.idle_total) | sum(a.idle_monthly_usage) |
+----------+-------------------+---------------------------+
| abc      |               485 |         90387.13690185547 |
| xyz      |               815 |         66242.01857376099 |
| qwe      |               122 |        11730.609939575195 |
| asd      |                80 |         9543.170425415039 |
| zxc      |                87 |         8027.090087890625 |
| dfg      |                67 |         7303.070011138916 |
| wqer     |                76 |         5234.969814300537 |
0
Apratim Das 21 Май 2014 в 15:04

2 ответа

Лучший ответ

Вместо преобразования его в активную запись вы можете использовать метод find_by_sql. Поскольку ваш запрос немного сложен.

Вы также можете использовать ActiveRecord::Base.connection для непосредственного извлечения записей.

Как это,

ActiveRecord::Base.connection.execute("your query") 
2
rajesh023 21 Май 2014 в 11:18

Вы можете создать подзапрос отдельно с ActiveRecord и преобразовать его в sql с помощью to_sql

Затем используйте joins, чтобы присоединиться к вашему столу. a с b, что это подзапрос. Также обратите внимание на использование предложений активной записи select, where, group и order , которые в основном необходимы для построения этого сложного SQL-запроса в ActiveRecord.

Что-то вроде следующего будет работать:

subquery = SubModel.select("DISTINCT ... ").where(" ... ").to_sql

Model.select("b.owner, ... ")
  .joins("JOIN (#{subquery}) b ON a.hostclass = b.hostclass")
  .where(" ... ")
  .group("b.owner")
  .order("Sum(a.idle_monthly_usage) DESC")
1
Rafa Paez 21 Май 2014 в 11:59