Как отсортировать пользователей форума по «total_content_length», а затем по самому последнему сообщению?

#ruby-on-rails #ruby-on-rails-3 #activerecord #active-relation

#ruby-on-rails #ruby-on-rails-3 #activerecord #active-relationship

Вопрос:

Я хотел бы отсортировать пользователей форума по total_content_length . Чтобы получить лучших n авторов на форуме, я делаю:

 User.order("total_content_length DESC").limit(n)
  

Теперь проблема в том, что есть два (или более) пользователя с одинаковым total_content_length .
В этом случае я хотел бы отдать предпочтение пользователю, который создал сообщение самым последним.

Post имеет publisher_id поле (которое является пользователем id ).

Как бы вы это сделали?

Ответ №1:

Попробуйте использовать 2 инструкции order:

 User.order("total_content_length DESC").order("created_at DESC").limit(n)
  

Попробуйте это:

 class User < ActiveRecord::Base
  scope :your_scope_name, joins(:posts).order("posts.created_at DESC")
end
  

затем вы можете использовать это scope в сочетании с другими инструкциями

Комментарии:

1. Имя пользователя created_at здесь не имеет значения. Это должно быть как-то связано с Post ‘s created_at .

2. итак, вы можете создать некоторую область для пользователя, где вы найдете его сообщения, и упорядочить их по created_at, затем вы можете заменить .order(«created_at DESC») вашей новой областью

3. Как бы вы написали эту область для user?

4. вы можете использовать объединения в области видимости

5. @bor1s: Я буду признателен за более подробный ответ 🙂

Ответ №2:

Определите метод в вашей пользовательской модели, который выдает дату последнего сообщения (при условии, что у вас есть ассоциация сообщений):

 def date_of_last_post  
  posts.order('created_at DESC').limit(1)[0].created_at  
end
  

Тогда вы можете получить результат в виде:

 top_posters = User.order("total_content_length DESC").limit(n)
# write a conditional sorting algo that swaps values only 
# if a.total_content_length == b.total_content_length based on 'date_of_last_post'
  

Комментарии:

1. Это неправильно, потому что, когда вы выполняете sort! вы «забываете» о предыдущей order сортировке…

2. Отредактировал мой ответ. Это не лучший подход, но на данный момент он поможет вам работать. Вы можете использовать любой стандартный алгоритм сортировки.