Как я могу заставить этот сложный запрос работать с ActiveRecord? - PullRequest
0 голосов
/ 07 марта 2012

У меня сложный SQL-запрос, включающий 3 модели, которые создают виртуальные атрибуты, основанные на временных операциях ... В идеале, я хотел бы использовать методы ActiveRecord arel для генерации этого, чтобы он был лучше, но я понятия не имею, как.

  find_by_sql <<--sql
    SELECT username, count(*) as records, AVG(time_taken) as time_taken
    FROM (
      SELECT TIMESTAMPDIFF(HOUR, posts.created_at, reports.created_at) as time_taken,
             users.username as username
      FROM reports, users, posts
      WHERE reports.user_id = users.id AND 
            reports.post_id = posts.id
    ) AS dashboard_data # this name is unused, but apparently required
    GROUP BY username
  sql

Есть ли способ сделать что-то подобное в ActiveRecord? Или raw sql - единственный способ делать такие сложные вещи?

Ответы [ 2 ]

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

Я думаю, это эквивалентно тому, что вы делаете:

User.joins({:reports=>:posts}).
     group("users.username").
     select("users.username, 
             count(*) as records,
             avg(timestampdiff(hour, posts.created_at, reports.created_at)) as time_taken")
0 голосов
/ 07 марта 2012

Если это не из-за стола, вы застрянете, делая такие вещи. Вы выбираете из подзапроса, который выходит за рамки того, для чего предназначен ActiveRecord. ORM предназначен для отображения объектов в определенные строки в четко определенных таблицах.

Иногда вы можете притворяться, что все, что вы делаете, выглядит достаточно таблично, чтобы оно работало с использованием представления SQL. ActiveRecord с радостью использует представление, если к нему можно обращаться как к таблице. Например, если для него определен столбец id, который служит своего рода первичным ключом, он должен работать. В вашем случае вы могли бы GROUP BY users.id и выставить users.id AS id, а также users.username.

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