Rails 4 ActiveRecord order by count of association

Rails 4 ActiveRecord order by count of association

有一个视图我想显示

的内容

例如:

recipe.user.name 
recipe.name
recipe.picture
recipe.created_at

排序依据

recipe.likes.count

控制器:

@recipes_by_likes = Recipe.likes_count.paginate(page: params[:page])

型号:

Recipe has_many :likes

Like belongs_to :recipe

范围:

scope :likes_count, -> { 
  select('recipes.*, COUNT(likes.id) AS likes_count').
  joins(:likes).
  order('likes_count DESC')
}

但这给了我

SELECT  recipes.*, COUNT(likes.id) AS likes_count 
FROM "recipes" 
INNER JOIN "likes" ON "likes"."recipe_id" = "recipes"."id"  
ORDER BY "recipes"."created_at" DESC, likes_count DESC 
LIMIT 30 OFFSET 0

其中 returns 只有 1 个(错误的)结果。

1。查询

你不应该用他们的 id 来计算点赞数,因为它总是唯一的并且总是 return 1,而应该用 recipe_id 来计算点赞数,这与与 a 相关联的点赞数相同某些食谱。

scope :likes_count, -> { 
  select('recipes.*, COUNT(likes.recipe_id) AS likes_count')
  .joins(:likes)
  .group('recipes.id')
  .order('likes_count DESC')
}

2。计数器缓存方法

您也可以使用 counter_cache

class Like < ActiveRecord::Base
  belongs_to :recipe, counter_cache: true
end

并向 Recipe 模型添加一列

add_column :recipes, :likes_count, :integer, default: 0