Я бы рекомендовал вам использовать AR counter cache здесь:
4.1.2.4: counter_cache
Опция :counter_cache
может быть использован для нахождения числа принадлежащих объектов более эффективным.
[...]
Хотя опция :counter_cache
указана в модели, которая включает объявление belongs_to
, фактический столбец должен быть добавлен в соответствующую модель.
Таким образом, вы бы изменить соответствующие belongs_to
декларации включить :counter_cache
вариант:
class Vote < ActiveRecord::Base
belongs_to :post, :counter_cache => true
end
# Similarly for the other two...
, а затем добавить счетчик столбцы в таблице posts
в миграции:
def change
change_table :posts do |t|
t.integer :votes_count
#...
end
end
You» Также хочу выполнить миграцию для инициализации счетчиков для существующих Post
.
Тогда вы будете иметь счетчики как свойства ваших моделей, и вы можете сказать что-то вроде:
Post.where(...).order('posts.votes_count + posts.comments_count + posts.ratings_count')
Если вы хотите включить created_at
, то вы можете использовать extract(epoch from created_at)
, чтобы получить временную метку в качестве удобной двойной точности значение, которое вы можете использовать в арифметических выражениях.
Недостатком является то, что счетчики могут выйти из синхронизации, если вы отклониться, но волосы от Единого Истинного Пути к рельсам нирваны (или где-либо это действительно происходит;), так что вы должны будете будьте осторожны, чтобы не касаться базы данных самостоятельно и всегда проходите через ассоциации, чтобы создавать и уничтожать вещи. Я также рекомендую вам создать быстрый «грязный» метод проверки работоспособности, который вы можете запускать время от времени, чтобы убедиться, что счетчики правильные.
Если вы счастливы быть специфичными для PostgreSQL, тогда вы можете перехватить ерунду :counter_cache => true
и всю хрупкость, которая приходит с ней, и использовать триггеры в базе данных для поддержания значений кешированных счетчиков.
Я согласен с вашим ответом в некоторой степени, но в случаях с большим количеством сообщений, где вы хотите сделать разбиение на страницы или просто получить верхние результаты N, тогда извлечение всех записей из базы данных может быть проблематичным – Lummo