=?iso-8859-1?q?Probl=E8me_de_jointures?=


#1

Bonjour,

Je rencontre un problème suite à une jointure de type NN
J’ai une table events, une table contacts ainsi que la table
contacts_events.
J’ai declaré dans les modèles de contacts et events
has_many_and_belong_to xxx

Depuis le controller de events, je charge en edition les infos de
l’évenement ainsi que le contact associé
def edit
@event = Event.find(params[:id], :include => :contacts)
@contact = @event.contacts
@contactNom = @contact.nom # Cette ligne provoque une erreur
end

La dernière ligne de code provoque une erreur :
undefined method `nom’ for Contact:ClassEn revanche, dans les debugs que
j’affiche dans le formulaire <%= debug @event %>
et <%= debug @contact %>), je vois bien les informations de events
ainsi que celle de contacts.

Voici ce qui est affiché pour <%= debug @event %> ::
— &id001 !ruby/object:Event
attributes:
date: 2006-04-11 00:00:00
tel: ‘’
id: “1”
lieu: Paris
objet: Dvlpt with Ruby
contacts:

  • !ruby/object:Contact
    attributes:
    nom: KIKI
    photo_url: ‘’
    prenom: Joe
    tel: XX-XX-XX-XX-XX
    id: “1”
    email: removed_email_address@domain.invalid
    errors: !ruby/object:ActiveRecord::Errors
    base: *id001
    errors: {}Voici ce qui est affiché pour <%= debug @contact%> ::—
  • !ruby/object:Contact
    attributes:
    nom: KIKI
    photo_url: ‘’
    prenom: Joe
    tel: XX-XX-XX-XX-XX
    id: “1”
    email: removed_email_address@domain.invalid puis-je faire pour récupérer les infos de
    l’objet relié ?Merci d’avance.FX

#2

Bonjour François-Xavier,

@contact = @event.contacts
@contactNom = @contact.nom # Cette ligne provoque une erreur

end

La dernière ligne de code provoque une erreur :
undefined method `nom’ for Contact:Class

Comme un événement peut avoir plusieurs contacts.

@event.contacts va te retourner un tableau d’objet Contact,
même si ce tableau peut être réduit à un seul élément !

Donc tout dépend si tu veux le nom du premier contact ou
tous les noms des contacts.

@contact_nom = @contacts[0].nom

ou

@contact_noms = @contacts.collect { |c| c.nom }

Tu peux aussi tester avec script/console.

-- Jean-François.

#3

François-Xavier :

attributes:

  • !ruby/object:Contact
    attributes:
    nom: KIKI
    photo_url: ‘’
    prenom: Joe
    tel: XX-XX-XX-XX-XX
    id: “1”
    email: removed_email_address@domain.invalid

Au fait, on aurait pu deviner depuis les infos donnés par debug() :
tout est dans le tiret !

Lance un irb et tape les 4 commandes successives :

require ‘yaml’
puts ‘coucou’.to_yaml
puts [‘coucou’].to_yaml
puts [‘coucou’, ‘kikoo’].to_yaml

pour comprendre.

-- Jean-François.