#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
‘screated_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. Отредактировал мой ответ. Это не лучший подход, но на данный момент он поможет вам работать. Вы можете использовать любой стандартный алгоритм сортировки.