Ruby Forum Rails France > comment recupere la classe d'un attribut de clé etrangere

Posted by Richard Vincent (ricardvince)
on 04.03.2008 18:50
Bonjour,

Je vous explique mon probleme :

J'ai une table "line_items" avec comme attribut "product_id" et
"order_id" qui son des clé etrangere sur mes tables "product" et
"order".

J'aurai voulu savoir comment il ete possible de savoir de quel class
etait mes attribut "product_id" et "order_id"?

En fait je voudrai qu'il me retourne product_id -> class product et
order_id -> class order

J'ai essayer LineItem.new.product_id.class et
LineItem.new.order_id.class mais ca me retorune nilClass

Pouvez vous m'aider svp????
Posted by Fabien Jakimowicz (Guest)
on 04.03.2008 19:07
(Received via mailing list)
On Tue, Mar 4, 2008 at 6:50 PM, Richard Vincent
<list-incoming@andreas-s.net> wrote:
>  etait mes attribut "product_id" et "order_id"?
>
>  En fait je voudrai qu'il me retourne product_id -> class product et
>  order_id -> class order
>
>  J'ai essayer LineItem.new.product_id.class et
>  LineItem.new.order_id.class mais ca me retorune nilClass
>
>  Pouvez vous m'aider svp????

Si ce n'est déjà fait, il faut que tu ajoutes des relations entre tes
modèles. Dans ton cas :
line_item.rb:
belongs_to :product
belongs_to :order

order.rb:
has_many :line_items

product.rb:
has_many :line_items


Dans ton code, tu instancie un nouvel LineItem qui aura tous ses
attributs à nil et auront donc comme classe la classe Nil.
Si tu veux le faire sur une instance :
my_line_item = LineItem.find(:first)
my_line_item.product.class


Tu peux aussi le faire sur la classe LineItem directement, une fois
les relations écrites :
LineItem.reflections[:product].class_name

Il doit y avoir un moyen plus propre, mais je ne me rappelle plus
comment retrouver le nom de la classe.
--
Fabien Jakimowicz
Posted by Richard Vincent (ricardvince)
on 04.03.2008 19:23
oui j'ai deja fait mes relations et ce que tu a dis fonctionne tres 
bien.

par contre j'ai encore un souci, c'est comment savoir si je peut appeler 
la methode : LineItem.reflection[:product_id].class_name

par example j'ai un attribut "price" dans ma table mais je ne peut pas 
appeler LineItem.reflection[:price].class_name ce qui est normal

donc je ne sais pas comment faire pour differencier les attribut de cle 
etrangere des autres???
Posted by Fabien Jakimowicz (Guest)
on 04.03.2008 19:47
(Received via mailing list)
On Tue, Mar 4, 2008 at 7:23 PM, Richard Vincent
<list-incoming@andreas-s.net> wrote:
>  donc je ne sais pas comment faire pour differencier les attribut de cle
>  etrangere des autres???

Teste le sur un attribut et non sur une relation, tu verras que le
hash ne contient que des relations et non des attributs ;)
--
Fabien Jakimowicz
Posted by Richard Vincent (ricardvince)
on 04.03.2008 19:54
Excuse moi mais je debure en ruby on rails j'ai pas copris ce que tu a 
voulu me dire... :s

peut tu me rexpliquer?
Posted by Richard Vincent (ricardvince)
on 05.03.2008 13:49
j'ai finalement compris ce que tu as voulu me dire et ca fonctionne.

Par contre, je fait un "column_names" pour recuperer les attribut de ma 
class et un "reflection" pour avoir mes clef etrangere.

Donc dans "columns_name" j'ai "order_id" et "product_id" mais dans 
"reflection" j'ai "order" et "product" et je sais pas comment faire 
correspondre les 2?

Je sais que par convention les cles etrangeres se nomme "class_id" mais 
si quelqu'un fait autrement mon prjet ne fonctionnera pa....

Est ce que quelqun a une idée?
Posted by Fabien Jakimowicz (Guest)
on 05.03.2008 15:49
(Received via mailing list)
On Wed, Mar 5, 2008 at 1:49 PM, Richard Vincent
<list-incoming@andreas-s.net> wrote:
>  Je sais que par convention les cles etrangeres se nomme "class_id" mais
>  si quelqu'un fait autrement mon prjet ne fonctionnera pa....
>
>  Est ce que quelqun a une idée?
>
>
regarde les objets retournés via la reflection, tu as plein
d'attributs notamment le nom de la colonne avec laquelle est faite la
liaison. Tu n'as plus qu'a éliminer ces colonnes lors de ton parcours
du column_names et hop.

--
Fabien Jakimowicz