我正在寻找有关向<& @projects.each do | project | %>
我希望此徽章显示页面上所有项目的项目计数。
视图/项目/ index.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>
视图/布局/ _header.html.erb
<span class = "badge">projects.total</span>
我意识到我可能需要一个&#34;总计&#34; projects.item_count的变量。
然后我可能想把那个&#39; projects.total变量放在public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
旁边
寻找适当/最佳方式来解决所有这些问题。
答案 0 :(得分:1)
要获取模型的记录总数,只需在模型类上调用.count
即可。
irb(main):004:0> User.count
(0.8ms) SELECT COUNT(*) FROM "users"
=> 1
然而,这不能用于关联,因为关联的对象属于实例 - 而不属于类。因此Project.items.count
不起作用,Item.count
不起作用。这同样适用于集合(@projects.items.count # error
)。
最简单的方法是:
<span class="badge"><%= project.items.size %></span>
我们使用.size
instead of .length
or .count
,因为它很聪明,如果已经加载了项目,它将不会导致额外的SQL查询。
请注意project
是Project的实例。
如果您打算在视图中的其他区域使用这些项目,可以将其与.joins
or .includes
query一起使用。
@products = Product.joins(:items).all
如果未加载它们,则每个项目将导致一次额外的SQL查询。为避免这种情况,您可以使用所谓的计数器缓存。
class Item < ActiveRecord::Base
belongs_to :project, counter_cache: true
end
虽然在模型上指定了:counter_cache选项 包括belongs_to声明,必须添加实际列 到相关的模型。 http://guides.rubyonrails.org/association_basics.html
您可以使用以下迁移创建列:
$ rails g migration AddItemsCountToProjects items_count:integer