我在ActsAsTaggableOn
型号上使用Item
。
要获取标记有特定标记的所有项目的列表,我必须这样做:
Item.tagged_with("some_tag")
但是,我在导航部分中使用它,以根据标记中的项目数量动态生成标记导航。我想要4个标签,这些标签的项目数量最多。
所以我在navigation
部分:
<% Item.tag_counts.order(:count).limit(4).each do |tag| %>
<% if params[:tag] == tag.name %>
<li class="active"><%= link_to tag.name.capitalize, tag_path(tag.name) %></li>
<% else %>
<li><%= link_to tag.name.capitalize, tag_path(tag.name) %></li>
<% end %>
<% end %>
然而,当我只说2或3个项目(即任何数量低于4但大于1)并且我有一个已被标记但未被“批准”的项目(即它直到页面上才显示它已被管理员批准,并且is_approved
已将false
更改为true
,tag
显示在此列表中(这很糟糕,我不想要当没有项目被批准时显示它,但是当您点击标签时该项目不会显示(这很好,因为它尚未被批准)。
如何修改each
语句以适应items
的{{1}}?
确定approved
是否获得批准的最简单方法是:
Item
示例:
item.is_approved?
修改1:
> i
=> #<Item id: 17, name: "10pp-logo", link: "10pound.zip", description: "10PP Logo.<br><br>Full of graphical good...", price: 6.99, user_id: 1702, created_at: "2013-11-24 12:56:05", updated_at: "2013-11-24 12:56:05", image: "ten.png", is_approved: false, approved_at: nil>
> i.is_approved?
=> false
答案 0 :(得分:0)
为什么不只列出已批准的项目?
class Item < ActiveRecord::Base
def self.approved_and_tagged_with(tags)
self.tagged_with(tags).where(approved: true)
end
end
# View
Item.approved_and_tagged_with("some_tag")
更新:包装标记最多的项目
class Item < ActiveRecord::Base
scope :approved, where(approved: true)
# @param: options. allow nil
# example: most_tagged(limit: 10, require_approval: false)
def self.most_tagged(options={})
limit = options[:limit] || 4
require_approval = options[:require_approval] || true
results = tag_counts.order(:count).limit(limit)
results = results.approved if require_approval?
results
end
end
# View
Items.most_tagged.each do |item|
# blah blah
end