Как перечислить картины на основе количества голосов
-
28-09-2019 - |
Вопрос
У меня есть модель картины. Голоса встроены в живопись. Как я могу запрашивать все картины и порядок по количеству голосов? Теоретически я хотел бы перечислить все картины, начиная с большинства голосов.
Для справочных целей. Вот определение двух моделей:
class Painting
include Mongoid::Document
include Mongoid::Timestamps
field :title, :type => String
embeds_many :votes
...
end
class Vote
include Mongoid::Document
include Mongoid::Timestamps
embedded_in :painting, :inverse_of => :votes
...
end
Решение
Вы можете сделать это с помощью Counter Cache Column. Отказ Как только вы реализуете эту функциональность, как упоминаться здесь: http://railscasts.com/episodes/23-counter-cache-column, Таблица картин будет содержать столбец VOUTES_COUNT, который содержит количество голосов для каждой картины
Тогда вы можете легко добавить Named_scope в своей модели Painting.rb, чтобы заказать картины по количеству голосов:
class Painting
named_scope :order_by_maximum_votes, :order => "votes_count DESC"
end
Тогда вы можете получить все картины, как этот путь:
@paintings = Painting.all.order_by_maximum_votes
Другие советы
Если вы все еще не хотите использовать добавить еще один столбец в базе данных, вы можете иметь другой простой вариант. Получите все картины из базы данных, а затем сортируйте их по голосам:
# It fetches all paintings needed
@paintings = Painting.all
# Then sort them by number of votes
@paintings = @paintings.sort {|p| p.votes.length}