使用 Rails 3.2 将带项目计数的徽章添加到我的导航栏

Add Badges with Item Count to my Navbar using Rails 3.2

我正在寻找 guidance/examples 向我的 <ul class = "nav navbar-nav">

添加徽章的最佳方式

我希望此徽章显示页面上所有项目的项目计数。

views/projects/index.html.erb

<& @projects.each do | project | %>

views/layouts/_header.html.erb

<nav class="navbar navbar-inverse navbar-default" role="navigation">
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<li class="active"><%= link_to "Projects", projects_path %> <span class="badge">(current)</span></li>

我知道我可能需要 projects.item_count 的 "total" 变量。

然后我可能想把那个'projects.total变量放在<span class = "badge">projects.total</span>

旁边

正在寻找 proper/best 方法来解决所有这些问题。

已添加:

要获取模型的总记录数,您只需在模型 class.

上调用 .count
irb(main):004:0> User.count
   (0.8ms)  SELECT COUNT(*) FROM "users"
=> 1

然而,这不能用于关联,因为关联对象属于实例 - 而不是 class。所以 Project.items.count 不起作用,但 Item.count 起作用。这同样适用于集合 (@projects.items.count # error).

如果您需要项目的项目数:

最简单的方法是:

<span class="badge"><%= project.items.size %></span>

我们使用 .size instead of .length or .count,因为它很聪明,因为如果项目已经加载,它不会引起额外的 SQL 查询。

请注意 project 是项目的一个实例。

如果您打算在视图的另一个区域使用这些项目,您可以将其与 .joins or .includes query 一起使用。

@products = Product.joins(:items).all

如果您不使用这些物品...

如果未加载它们,每个项目将导致一个额外的 SQL 查询。为避免这种情况,您可以使用所谓的计数器缓存。

class Item < ActiveRecord::Base
  belongs_to :project, counter_cache: true
end

Although the :counter_cache option is specified on the model that includes the belongs_to declaration, the actual column must be added to the associated model. http://guides.rubyonrails.org/association_basics.html

您可以使用以下迁移创建列:

$ rails g migration AddItemsCountToProjects items_count:integer