Ouverture de session

Commentaires récents

Syndication
Flux XML

ActiveRecord : relation multiple en cascade : à l'aide !

ActiveRecord : relation multiple en cascade : à l'aide !
Posté par nicolas le Mardi, 15 Avril, 2008 - 10:21am. Débuter avec Rails

Bonjour à toutes & à tous,

J'ai le souci suivant: retrouver pour un produit les catégories qui lui sont liées et qui répondent à un datatype donné, datatype défini lui-même dans une autre table...

1. TABLES
products: id + autres champs
links_category_product: category (int), product (int)
categories: id, datatype(int) + autres champs
datatypes: id, description(string)

2. CLASSES
class Datatype
  has_many :categories
end

class Category
  belongs_to :datatype, :class_name => "Datatype", :foreign_key => :datatype
  has_many :link_category_products, :foreign_key => :category
  has_many :products, :class_name => "Product", :through => :link_category_products
end

class LinkCategoryProduct
  set_table_name "links_category_product"
  belongs_to :category, :class_name => "Category", :foreign_key => :category
  belongs_to :product, :class_name => "Product", :foreign_key => :product
end

class Product
  has_many :link_category_products, :foreign_key => :product
  has_many :categories, :class_name => "Category",
     :through => :link_category_products do
      def find_these(name)
       find :all, :conditions =>[ :categories.datatype, :datatype.description == name]
      end
     end
end

3. CONTROLLER lists_controller.rb
class ListsController
  def list_products
   @items=Product.find(:all)
  end
end

4. VUE list_products.html.erb
dans une table:
 % @items.each do |item| %
  tr - td
  %=h item.categories.find_these("par_exemple") %
  /td - tr
 % end %

5. ERROR
undefined method `datatype' for :categories:Symbol
Ca coince dans le 'do'... de la dépendance 'categories' de la classe Product...?
Au secours, plize!

6. Merci à toutes les bonnes âmes secourables.

Nicolas



[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | sujet précédent | sujet suivant | envoyer par email ]

Options d'affichage des commentaires
Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder" pour activer vos changements.

Sujet: 
class Product has_many
Auteur: 
hery
Date: 
Jeu, 17/04/2008 - 08:48


class Product
has_many :link_category_products, :foreign_key => :product
has_many :categories, :class_name => "Category",
:through => :link_category_products do
def find_these(name)
find :all, :conditions =>[ :categories.datatype, :datatype.description == name]
end
end
end

Tu as une erreur dans les conditions de ton find :)

.... blablabla ...

def find_these(name)
find :all, :conditions =>[ "categories.datatype = ? ", name]
end

Peux tu nous dire ce que tu veux faire avec ce find ?


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Merci Hery,voici en détail
Auteur: 
nicolas
Date: 
Jeu, 17/04/2008 - 11:46

Merci Hery,

Voici en détail les tables de la base de données
datatypes : id , description (unique)
categories : id, datatype, description (couple datatype-description unique)
products : id, category1, category2 (couple category1-category2 unique)
link_category_products: category, product (couple category-product unique)

Je souhaite afficher la description de la catégorie associée (à travers la table link_category_products) à un produit donné et répondant à tel ou tel type.

Exemple
soit un produit "p" : afficher la catégorie associée (si elle existe) de type "couleur".

Procédé
1. rechercher le datatype dont la description = "couleur"
2. rechercher les catégories liées à "p"
3. retenir uniquement la catégorie dont le datatype = celui trouvé en (1)
4. afficher la description de la catégorie

Merci de votre aide,
Nicolas.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Bon il faut dégrossir tout
Auteur: 
hery
Date: 
Ven, 18/04/2008 - 00:48

Bon il faut dégrossir tout ça ou alors j'aim mal compris :

Tu as en fait 3 vraies classes : Product (products), Category(categories) et Datatype (datatypes)

Pourquoi y-a-til 2 champs de catégories dans Product? Ce qu'il faudrait c'est d'avoir une table de relation entre products et categories (qu'on appelle categories_products) Ainsi il sera possible de mettre plus que 2 :) A moins que les deux champs jouent des rôles complètement différents (rôles non symétriques), et là le has_many :through serait assez légitime

Si tu veux vraiment 2 champs uniques, il faudra à ce moment faire un peu de validation dans tes classes, un petit before_add et autres dans le habtm

Les tables :

products : id, autres ...
categories : id, datatype_id, description, autres ...
datatypes: id, description
categories_products : category_id, product_id (table de relation n-n )

class Product < ARB
has_and_belongs_to_many :categories
end

class Datatype
has_many :categories
validates_uniqueness_of :description
end

class Category < ARB
belongs_to :datatype
has_and_belongs_to_many :products # une catégorie appartient à plusieurs produits (et vice et versa)
validates_uniqueness_of :description, :scope => datatype_id # unicité du couple datatype_id/description
end

Et tout simplement pour rechercher une catégorie pour un produit donné :

Exemple :

p=Product.find(1)
cat = p.categories.find_by_datatype_id(Datatype.find_by_description('couleur').id) # On peut faire une extension ce qui serait plus propre ... mais je te laisse le faire ;)
puts cat.description


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Merci beaucoup Hery
Auteur: 
nicolas
Date: 
Ven, 18/04/2008 - 18:01

Cela fonctionne impeccable. L'extension aussi.
Meri encore,
Nicolas.


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
You are welcome :)
Auteur: 
hery
Date: 
Ven, 18/04/2008 - 19:52

You are welcome :)


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Nouveaux liens

Sondage
Lorsque je développe avec Ruby on Rails c'est principalement sous:
Linux
37%
Mac OS X
29%
Windows
32%
(Free|Open|Net) BSD
1%
Autre...
1%
Nombre de votes: 356

Qui est en ligne
Il y a actuellement 1 utilisateur et 104 invités en ligne.

railsfrance.org - communauté francophone des utilisateurs de Ruby on Rails
[ Hébergement et ressources techniques gracieusement fournis par la SSLL Nuxos Group ]