2013-03-17 2 views
0

product.rbhas_many: par le biais - correspondent à la catégorie existante de produits, sinon créer une nouvelle catégorie de produits

class Product < ActiveRecord::Base 
    attr_accessible :description, :name 

    has_many :categorizations 
    has_many :categories, :through => :categorizations 

    validates :name, uniqueness: true 
end 

category.rb

class Category < ActiveRecord::Base 
    attr_accessible :name 

    has_many :categorizations 
    has_many :products, :through => :categorizations 

    validates :name, uniqueness: true 
end 

categorization.rb

class Categorization < ActiveRecord::Base 
    attr_accessible :category_id, :product_id # Should I leave these accessible? 

    belongs_to :product 
    belongs_to :category 
end 

C'est ce que je suis en train dans le terminal:

> p1 = Product.create(name: "Product A", description: "Product A description") 
> p1.categories 
> [] 
> Category.all 
> [] 
> p1.categories.create(:name => "Cat A") 
> p1.categories.find(1).name 
> ["Cat A"] 
> 
> p2 = Product.create(name: "Product B", description: "Product B description") 
> p2.categories 
> [] 
> p2.categories.update_attributes(:name => "Cat A") 

je reçois une erreur de méthode non définie pour « update_attributes ».

  1. Comment attribuer un produit à une catégorie sans créer de catégorie en double dans la base de données? (Puisque "Cat A" est déjà créé ci-dessus, comment puis-je attribuer "p2" pour avoir cette même catégorie, tout en gardant un seul enregistrement de "Cat A" dans la base de données?)
  2. Lorsque je cherche un Lorsque je tape "p.categories.name", je récupère le nom du modèle "Category". Comment puis-je récupérer les noms de catégories dans un tableau?
  3. Quelle est la meilleure façon de l'implémenter dans un formulaire Web?

Répondre

0

J'espère que votre attribut de nom de catégorie est unique.

@categoryCatA = Category.find_by_name("Cat A") 

p1.categories << @categoryCatA 

p2.categories << @categoryCatA 

Pour obtenir les noms de toutes les catégories attribuées à un produit, cela retourne un tableau:

p1.categories.map {|category| category.name} 
Questions connexes