如何迭代类别并获取子菜单的所有名称?

时间:2015-10-28 07:05:14

标签: ruby-on-rails

我尝试创建一个侧边栏,其中第一个级别是类别,子菜单将是名称。

数据库架构

  create_table "products", force: :cascade do |t|
    t.string   "niche"
    t.string   "category"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

控制器

def index
@product = Product.group(:category)
end

查看

<% @product.each do |t| %>
 <li>
  <a href="javascript:;">
  <span class="title"><%= t.category %></span>
  </a>
 </li>
<% end %>

现在我可以遍历所有可用的类别,但是如何从每个类别中获取“利基”并显示在子菜单中?

2 个答案:

答案 0 :(得分:1)

<%= @product.each do |product| %>
   <%= content_tag :li do %>
      <%= product.category %>
      <%  Product.where(category: product.category).pluck(:niche).distinct.each do |niche| %>
         <%= niche %>
      <% end %>
   <% end %>
<% end %>

这将直接回答您的问题。

虽然你可能让SQL使用一个查询(使用self join),但将categories作为自己的表会更有益。

-

  

我怎样才能获得&#34; niche&#34;从每个类别和子菜单中显示?

您可以使用正确的associations确定您要求的内容。

目前,您在category表格中将products写为纯字符串。这没有任何问题,但会阻止您添加任何额外的功能(extensibility)。

我会使用has_many关系将productcategory模型绑定在一起。然后我可以在product模型中make a hierarchy来表示&#34; niche&#34;:

#app/models/product.rb
class Product < ActiveRecord::Base
   # columns id | category_id | name | created_at | updated_at
   belongs_to :category
end

#app/models/category.rb
class Category < ActiveRecord::Base
   # columns id | name | parent_id | created_at | updated_at
   has_many :products
   acts_as_tree
end

这将允许我执行以下操作:

@categories = Category.all
@categories.each do |category|
   category.children.each do |niche| #-> niches
      niche.name #-> this will be a category also
      niche.products.each do |product|
         product.name #-> product is a member object with "Product" model data
      end
   end
end

<强>更新

以下是Product保存时添加类别的方法:

#app/models/product.rb
class Product < ActiveRecord::Base
   before_create: :assign_category

   private

   def assign_category
      self.category_id = Category.find_By name: self.category
   end
end

答案 1 :(得分:0)

根据您的架构&#34;利基&#34;是产品的属性。 所以你必须做这样的事情<%= t.niche %>

如果您希望在类别级别上使用此功能,则必须创建逻辑关联。类似产品的东西有很多类别,并且在类别表上将利基作为属性。

(供参考,参见:http://guides.rubyonrails.org/association_basics.html