2017-04-20 125 views
2

我有三個表,其中之一是許多一對多的關係表顯示元素的列表:如何使用連接表

class Category < ApplicationRecord 
    has_many :categorizations 
    has_many :products, :through => :categorizations 
end 

class Product < ApplicationRecord 
    has_many :categorizations, dependent: :destroy 
    has_many :categories, :through => :categorizations 
end 

和表格分類已:

class Categorization < ApplicationRecord 
    belongs_to :category 
    belongs_to :product 
end 

def product_params 
    params.require(:product).permit(:name_product, :hallmark, :description, :image_url, :price, category_ids:[]) 
    end 

在new.html.erb:

我一個陣列中已保存的類別的ID

<% Category.all.each do |category| %> 
    <label> 
     <%= check_box_tag "product[category_ids][]", category.id, field.object.categories.include?(Category) %> 
     <%= category.name_category %> 
    </label> 
    <%end%> 

我無法顯示類別名稱。在show.html.erb中,我嘗試了一切,但它只顯示產品所屬類別的ID。

如何顯示類別名稱?在數據庫中,我可以做一個JOIN,但在Ruby on Rails中很難。

+0

什麼是部門?你的'new.html.erb'代碼與問題中其餘的信息無關。 – infiniteRefactor

+1

「在數據庫中,我可以加入......」。是的,這可能是正確的做法。當DBM能夠完成篩選和處理工作時,您希望避免移動大量數據,並讓Ruby或Rails完成繁重的工作。我已經看到需要花費數秒鐘才能完成數據移動的任務,而在Ruby中處理的任務需要亞秒級時間才能讓DBM進行搜索,篩選和緊縮,然後僅返回所需的記錄。這可以減少應用程序或Web服務器上的網絡負載和CPU負載。 –

回答

0

它不能在Rails中將關係存儲在數組列中。您可能會加載必要的categories並通過category id訪問。

# for single product 
category_ids = product.category_ids 
# for many products 
category_ids = products.flat_map(&:category_ids) 

# load categories 
categories = Category.where(id: category_ids).index_by(&:id) 
# the result structure 
# {1 => #<Category id: 1, ...>, 2 => #<Category id: 2, ...> ... } 

# now all related categories preloaded 
products.each do |product| 
    product.category_ids.each do |category_id| 
    puts categories[category_id] 
    end 
end