我想显示带有排名的项目。我想显示即使没有的项目。我试图编写如下代码。但是不会显示0之类的项目。你有个好主意吗?
def show
@all_ranks = Item.find(Like.group(:item_id).order('count(item_id) desc').pluck(:item_id))
@ranking_item = @all_ranks.select{ |item| item.category_id == @category.id }
end
答案 0 :(得分:0)
您需要LEFT JOIN。
您还可以使用 where 语句来优化您的方法,以仅获取具有特定类别的项目。因此,您的方法应如下所示:
def show
@rating_items = Item.select('items.id', 'COUNT(*) AS likes_count')
.joins('JOIN likes ON likes.item_id = items.id')
.where('items.category_id' => @category.id)
.group('items.id')
.order('likes_count DESC')
end
并且在视图中,您可以使用如下代码:
<% @rating_items.each do |item| %>
<p><%= "#{item.id} - #{item.likes_count}" %></p>
<% end %>
我不知道您使用的是哪个Rails版本。如果使用Rails 5. *,可以看一下left_joins方法。因此,对于Rails 5. *,您可以尝试:
def show
@rating_items = Item.select('item.id', 'COUNT(*) AS likes_count')
.left_joins(:likes)
.where('items.category_id' => @category.id)
.group('items.id')
.order('likes_count DESC')
end