2015-10-28 41 views
1

我試着創建一個側邊欄,第一層將是類別和子菜單將是名稱。如何迭代類別並獲取子菜單的所有名稱?

DB模式

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

嘗試'<%= t.category。利基%>' – Pavan

回答

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 %> 

這將直接回答你的問題。

儘管您可能可以使用一個查詢(使用self join)獲得SQL,但將categories作爲自己的表將會更有好處。

-

我如何能得到「小衆」,從每個類別顯示在子菜單?

你問的問題可以通過正確的associations修復。

目前,您在products表中將category寫爲純字符串。這沒有什麼不妥,但會阻止你添加任何額外的功能(extensibility)。

我會使用has_many關係將productcategory模型綁定在一起。我可以那麼product模型內make a hierarchy表示 「小衆」:

#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 
+0

由於我從sax解析中保存數據,因此我默認獲取表數據(在Products表中將字符串保存爲字符串)。有沒有方法可以很容易地將它們分離到一個分類表中? – pyfl88

+0

目前,我的方法是在產品模型中寫一個'after create'方法,每次創建一個新產品時根據類別數據保存category_id。像這樣'self.update(category_id:Category.where(「name =?」,self.category).first.id)「的例子。這種方法會有什麼問題嗎? – pyfl88

+0

好吧,它增加了一個遞歸的級別,這會損害效率。你幾乎就在那裏 - 只需在保存你的模型之前填寫'category_id'(我寫了一個更新) –

0

根據您的模式「niche」是產品上的一個屬性。 所以你必須做這樣的事情<%= t.niche %>

如果您希望在類別級別具有此功能,則必須創建邏輯關聯。就像產品has_many類別一樣,使類別表格上的屬性成爲一個屬性。

(僅供參考見:http://guides.rubyonrails.org/association_basics.html

+0

同意,你擁有的結構是不正確的,你在做什麼。你可以做這樣的Product.where(類別:@ product.category).pluck(:niche),但這很醜陋。我不會寬恕這一點。 –

相關問題