Paris on Rails 2008

Ouverture de session

Commentaires récents

Syndication
Flux XML

Associations N-N

Associations N-N
Posté par fenreal le Mercredi, 7 Février, 2007 - 6:33pm. Débuter avec Rails

Bonjour à tous,
J'ai un nouveau problème dans mon projet.
J'ai un patient qui peut appartenir à plusieurs études.
J'ai créé mes tables et ma table de jointure :
- patients
- refetudes
- patients_refetudes

Maintenant il faut que, dans la création ou la modification d'un patient, je lui attribue 0 à n études mais je ne sais pas du tout comment m'y prendre.
Aussi bien au niveau de l'interface qu'au niveau du code derrière.

Comment faire pour qu'une personne puisse ajouter autant d'études que nécessaire à une personne.
J'avais pensé à un menu déroulant, on choisi une étude si on le souhaite, si on choisit une étude, un autre menu déroulant apparait en dessous qui permet d'en choisir un 2ème, si on le fait un 3ème apparait et ainsi de suite.

Mais je ne sais déjà pas comment programmer cette interface, et comment ajouter les lignes dans la table de jointure ?
Dois-je stocker à la volée (si c'est possible) ou sauvegarder chaque choix quelque part pour insérer les lignes en after_create (une fois que l'id a été créé)

Merci d'avance



[ 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: 
Apparemment il y a ça
Auteur: 
Zfred
Date: 
Ven, 09/02/2007 - 17:10

Apparemment il y a ça :
collection_select_multiple_categories

Je ne peux pas t'en dire plus, je suis en plein dedans, et je galere.
Ca permet de faire une multisélection dans une combo.

Si quelqu'un l'a déja testé, merci infiniment de bien vouloir coller un exemple ici, c'est l'horreur les tutos où il n'y a pas d'exemple !


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

Sujet: 
Ca permettrait de faire une
Auteur: 
Fabien Jakimowicz
Date: 
Sam, 10/02/2007 - 16:55

Ca permettrait de faire une selection dans un select, pas dans des checkbox.

Si cette url peut t'aider: http://woss.name/2006/11/25/multi-select-boxes-in-your-rails-view

Ca me surprend qu'il n'existe pas d'helper pour ca.


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

Sujet: 
Tes modeles:
Auteur: 
Fabien Jakimowicz
Date: 
Mer, 07/02/2007 - 19:50

Tes modeles:

class Patient < ActiveRecord::Base
  has_and_belongs_to_many :refetudes
end
class Refetude < ActiveRecord::Base
  has_and_belongs_to_many :patients
end

Le controlleur des patients:

class PatientController < ApplicationController
  def update
    @patient = Patient.find(params[:id])
    if @patient.update_attributes(params[:patient])
      @patient.refetudes = params[:refetudes].nil? ? Array.new : Refetude.find(params[:refetudes])
      redirect_to :action => 'show', :id => @patient
    else
      render :action => 'edit'
    end
  end
end

Et enfin dans les vues, en considerant que tu as un name:

<= Refetude.find(:all).collect {|r| check_box_tag('refetudes[]', r.id, @patient.refetudes.include?(r)) + r.name} >

J'avais du faire ca rapidement une fois, c'est loin d'etre optimal mais ca peut toujours aider.


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

Sujet: 
Salut,
Auteur: 
fenreal
Date: 
Jeu, 08/02/2007 - 11:57

Salut,
merci de l'aide.
Malheureusement pour l'instant ça ne fonctionne pas car j'ai fais une erreur.
J'ai confondu étude et origine.
Donc j'ai fais un mix des trucs, ça pouvait pas aller

Voilà, quand je ne suis pas couillon, ça marche beaucoup mieux :p

Merci beaucoup en tout cas pour cette aide car ça va beaucoup m'aider par la suite.

Mais pourrais-tu m'expliquer ces lignes que tu as rajoutées :

et
@patient.refetudes = params[:refetudes].nil? ? Array.new : Refetude.find(params[:refetudes])

Car je ne suis pas du tout familier avec ce genre de notation.
Je sais que le point d'intérrogation est une sorte de if avec dans un cas il faut faire et dans le cas l'autre, mais je ne sais plus exactement comment ça fonctionne.

Merci d'avance si tu as le temps de m'expliquer


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

Sujet: 
J'imagine que la ligne que
Auteur: 
Fabien Jakimowicz
Date: 
Jeu, 08/02/2007 - 14:51

J'imagine que la ligne que tu as copie et qui n'est pas passee est la suivante :

<%= Refetude.find(:all).collect {|r| check_box_tag('refetudes[]', r.id, @patient.refetudes.include?(r)) + r.name} %>

elle peut etre ecrite de la facon suivante :

<% for r in Refetude.find(:all) %>
  <%= check_box_tag('refetudes[]', r.id, @patient.refetudes.include?(r)) + r.name} %>
<% end %>

En gros, c'est une boucle qui parcours toutes les refetudes de la base et qui pour chaque refetude (variable r) va afficher afficher une checkbox en verifiant si celle-ci doit etre cochee grace a la fonction include? (regarde la class Array dans la ruby-doc). Il ne s'agit pas d'une ternaire ici mais de la fonction include?

Pour la seconde ligne:

@patient.refetudes = params[:refetudes].nil? ? Array.new : Refetude.find(params[:refetudes])

on va derouler ca de la meme facon:

if params[:refetudes].nil?
  @patient.refetudes = Array.new
else
  @patient.refetudes = Refetude.find(params[:refetudes])
end

Ici encore, on a une fonction qui contient un '?' dans son nom. Note que tu peux grandement optimiser cette partie en vidant l'array plutot qu'en en creant un nouveau et surtout ajouter/supprimer les elements qui ont besoin d'une telle operation plutot que de reconstruire tout a chaque fois. Mais comme je te l'avais explique, c'est fait vite fait.

PS: j'avais oublie les '%' dans les balises des vues dans mon premier post, desole si cela t'a induit en erreur.


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

Sujet: 
Super, merci pour les
Auteur: 
fenreal
Date: 
Jeu, 08/02/2007 - 15:26

Super, merci pour les explications, c'est en gros ce que je doutais mais là comme ça c'est clair.
j'avais vu que tu avais oublié les %, le problème n'était pas là.
le probleme est que j'avais confondu refetude et reforigine
donc j'avais mis dans patient.rb :
has_many_and_belongs_to :reforigine

et dans reforigine.rb
has_many_and_belongs_to :patient

alors que c'est avec refetude que j'aurais du faire ça.

Mais après avec ça :

je cherchais des refetude et il ne les trouvait pas, forcement.

Bref, une erreur stupide d'inattention.

Merci encore, ça m'aide beaucoup.


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

Sujet: 
un conseil, mets les au
Auteur: 
Fabien Jakimowicz
Date: 
Jeu, 08/02/2007 - 15:55

un conseil, mets les au pluriel quand ca decrit des ensemble et non des entites.


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

Sujet: 
Salut, oui c'est ce que j'ai
Auteur: 
fenreal
Date: 
Jeu, 08/02/2007 - 17:48

Salut, oui c'est ce que j'ai fais en plus. J'écris vraiment n'importe quoi aujourd'hui :p


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

Sujet: 
Franchement t'es génial
Auteur: 
fenreal
Date: 
Jeu, 08/02/2007 - 17:59

Franchement t'es génial :p
ça m'a permis de me dépétrer de mon autre problème (du même type mais avec relation 1-N), grace à toi mon projet est quasiment fini ^^


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

Sujet: 
Une question liée à
Auteur: 
fenreal
Date: 
Jeu, 08/02/2007 - 18:08

Une question liée à ça.
sur la ligne :
@patient.refetudes = params[:refetudes].nil? ? Array.new : Refetude.find(params[:refetudes])

Si dans le cas ou il fait le Array.new je veux faire plusieurs choses, comme je peux m'y prendre ?

Pour faire simple, j'ai extrapolé ça pour faire :

@venue.alertes = params[:alertes].nil? ? Alerte.venue_id=@venue.id : Alerte.find(params[:alertes])

afin que quand une alerte est cochée, il l'associe à la venue.

Mais je voudrais qu'en plus d'attribuer l'id de la venue à Alerte.venue_id, il passe le Alerte.etat à 'prise en compte'.
Je ne sais pas trop comment organiser ça


[ 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
30%
Windows
32%
(Free|Open|Net) BSD
1%
Autre...
1%
Nombre de votes: 374

Qui est en ligne
Il y a actuellement 1 utilisateur et 50 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 ]