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
有一个视图我想显示
的内容例如:
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