ActiveRecord Группировка сообщений, созданных одним и тем же пользователем за последний час - PullRequest
0 голосов
/ 10 мая 2018

У меня есть модель Story.История создается пользователем, и эти истории попадают в канал.Если пользователь создает более одной истории в течение часа, я хочу показать только одну историю, поэтому мой вопрос заключается в том, как записать запрос ActiveRecord для группировки по created_at часу и user_id?

1 Ответ

0 голосов
/ 10 мая 2018

Так что это оказалось довольно легко.

Story.find_each.group_by do |story|
  [story.user_id, story.created_at.beginning_of_hour]
end

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

Если у кого-то есть лучший способ сделать это, я открыт для предложений.

Вот весь метод:

def self.smart_feed
    feed = []
    self.find_each(batch_size: 10).group_by do |story|
      [story.user_id, story.created_at.beginning_of_hour]
    end.map do |stories|
      if stories.second.count > 1
        temp_story = self.new()
        stories.second.map do |story|
          if story.ratings.any?
            temp_story.ratings.append(story.ratings)
          elsif story.flights.any?
            temp_story.flights.append(story.flights)
          end
          temp_story.description = "Added #{temp_story.ratings.size} new ratings and #{temp_story.flights.size} new flights"
          temp_story.user_id = story.user_id
        end
        feed.append(temp_story)
      else
        feed.append(stories.second.first)
      end
    end
    return feed.reverse
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...