Рельсы импрессионистов, как найти 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(impressions.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(impressions.id) DESC").
first(5)