我尝试创建一个侧边栏,其中第一个级别是类别,子菜单将是名称。
数据库架构
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 %>
现在我可以遍历所有可用的类别,但是如何从每个类别中获取“利基”并显示在子菜单中?
答案 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
关系将product
和category
模型绑定在一起。然后我可以在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)