2017-04-20 1 views
2

J'ai trois tables, dont l'un est un grand nombre à plusieurs table de relation:Comment afficher une liste d'éléments à l'aide d'une table de jointure

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 

et la table catégorisations:

class Categorization < ApplicationRecord 
    belongs_to :category 
    belongs_to :product 
end 
Je

sauvé les catégories ids dans un tableau:

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

en new.html.erb:

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

Je ne peux pas afficher les noms des catégories. Dans show.html.erb j'ai tout essayé, mais il n'affiche que l'identifiant des catégories auxquelles appartient le produit.

Comment afficher les noms des catégories? Dans la base de données, je peux faire un JOIN, mais dans Ruby on Rails c'est difficile.

+0

Qu'est-ce qu'un secteur? Votre code 'new.html.erb' n'a rien à voir avec le reste de l'information contenue dans la question. – infiniteRefactor

+1

"Dans la base de données, je peux faire un JOIN ...". Oui, et c'est probablement la bonne chose à faire. Vous voulez éviter de déplacer beaucoup de données et avoir Ruby ou Rails faire le gros du travail lorsque le DBM est capable de faire le travail de tamisage et de crunching. J'ai vu des tâches qui prenaient plusieurs secondes pour que le mouvement des données et le crunching dans Ruby prennent des temps inférieurs à la seconde pour que le DBM recherche, tamise et croque puis retourne seulement les enregistrements nécessaires. C'est payant dans la réduction de la charge du réseau et de la charge du processeur sur l'application ou le serveur Web. –

Répondre

0

Il ne peut pas dans Rails stocker une relation dans une colonne de tableau. Vous pouvez charger categories nécessaire et y accéder par 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