我如何优雅地结合这两个ruby命令?

时间:2013-11-25 07:45:40

标签: ruby-on-rails ruby ruby-on-rails-3 acts-as-taggable-on

我在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更改为truetag显示在此列表中(这很糟糕,我不想要当没有项目被批准时显示它,但是当您点击标签时该项目不会显示(这很好,因为它尚未被批准)。

如何修改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 

1 个答案:

答案 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