Рельсы импрессионистов, как найти 5 наиболее посмотреть

Я использую этот экземпляр, чтобы найти больше вида 5 Item, но не могу получить результат.
Можете научить меня как это получить?

 @test = Item.limit(5).joins(:impressions).group("impressions.impressionable_id").order("count(impressions.impressionable_id) DESC")

3 ответа

Решение

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

Или (не проверено, но должно работать)

Item.joins(:impressions).group("impressions.impressionable_id").order("count(impression‌​s.id) DESC").first(5)

В вашей миграции CreatePosts:

t.integer :visits, default: 0

в вашем post.rb:

is_impressionable counter_cache: true, column_name: :visits, :unique => :all

затем:

Post.order(visits: :asc).limit(5)

И эта штука все еще работает для рендеринга счетчика внутри вашего поста (Slim):

= post.impressionist_count

И да, это работает в PostreSQL и не имеет проблем с activeadmin (довольно удобно для Dashboard). Надеюсь, это поможет.

Ответ от Emu не сработает, если вы используете PostgreSQL. Смотрите здесь для объяснения.

ActiveRecord:: StatementInvalid: PG:: GroupingError: ERROR: столбец "items.id" должен присутствовать в предложении GROUP BY или использоваться в статистической функции

Просто добавьте столбец первичного ключа Item столик и все должно работать!

Item.joins(:impressions).
     group("items.id, impressions.impressionable_id").
     order("count(impression‌​s.id) DESC").
     first(5)
Другие вопросы по тегам