Рельсы объединяются в группы по и мин - PullRequest
0 голосов
/ 04 февраля 2020

Предположим, у нас есть таблица с именем Activities

+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1         | 2         | 2016-03-01 | 5            |
| 1         | 2         | 2016-05-02 | 6            |
| 2         | 3         | 2017-06-25 | 1            |
| 3         | 1         | 2016-03-02 | 0            |
| 3         | 4         | 2018-07-03 | 5            |
+-----------+-----------+------------+--------------+

Я хочу узнать player_id, и это first event_date как first_date.

SQL:

SELECT Activities.player_id, min(Activities.event_date) as first_date 
FROM `activities` 
GROUP BY `activities`.`player_id`

Таблица результатов:

+-----------+-------------+
| player_id | first_login |
+-----------+-------------+
| 1         | 2016-03-01  |
| 2         | 2017-06-25  |
| 3         | 2016-03-02  |
+-----------+-------------+

Как это сделать в Rails?

Я пробовал это, но получил коллекцию Activity, которая содержит только player_id.

Activity.select('Activities.player_id, min(Activities.event_date) as first_date')
        .group(:player_id)

Как это

[#<Activity:0x00007f94923bb888 player_id: 1>, #<Activity:0x00007f94923bb608 player_id: 2>, #<Activity:0x00007f94923b9ba0 player_id: 3>]

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

В результате вы получили только player_id, потому что когда вы делаете Activity.select('..'), rails возвращает объект модели ActiveRecord.

Возможно, вы захотите выполнить пользовательский запрос и преобразовать вывод в массив следующим образом:

result = ActiveRecord::Base.connection.execute("SELECT Activities.player_id, min(Activities.event_date) as first_date FROM activities GROUP BY activities.player_id")
result.to_a # Converts PG::Result to an array, 'result.as_json' converts to json

Надеюсь, это поможет.

0 голосов
/ 04 февраля 2020

На самом деле ваш результат запроса выше

result = [#<Activity:0x00007f94923bb888 player_id: 1>, #<Activity:0x00007f94923bb608 player_id: 2>, #<Activity:0x00007f94923b9ba0 player_id: 3>]

загружает столбец first_date, так как first_date не является атрибутом объекта действия, и рельсы не отображают виртуальные столбцы таким образом. Вы можете получить к нему доступ, используя этот синтаксис

result.last.first_date

Если вам нужно увидеть значение даты в результирующих объектах, измените ваш запрос следующим образом

Activity.select('Activities.player_id, min(Activities.event_date) as event_date').group(:player_id)

, тогда вы будете быть в состоянии получить желаемый результат

<Activity:0x00007f94923bb608 player_id: 2, event_date: 'date value' >, #<Activity:0x00007f94923b9ba0 player_id: 3, event_date: 'date value' >]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...