2012-06-25 7 views
1

Lutter pour obtenir une relation has_many: through fonctionne correctement avec un formulaire qui a la relation représentée par des boutons radio.has_many à travers avec des boutons radio

La relation décrit un Job auquel peuvent être associées plusieurs Métadonnées et ces Métadonnées peuvent être de Types différents. L'idée derrière ce modèle est que je serai éventuellement en mesure d'ajouter d'autres métadonnées à des emplois d'autres types dire une catégorie de quelque sorte ou de valeur sans avoir à ajouter de nouvelles tables, etc

Dans ce cas, j'ai un formulaire pour soumettre un travail, l'un des champs étant Type de travail (Temps plein, Temps partiel, Consultation, Freelance) représenté par quatre boutons radio.

Ainsi, lorsque vous enregistrez dans le DB que vous auriez dans les tableaux correspondants:

jobs 
id - 1 
title - "Rails Developer" 

jobs_metadata 
job_id - 1 
metadata_id - 1 

metadata 
id - 1 
description - "Full Time" 
metadatum_type_id - 1 

metadatum_types 
id - 1 
description - "Job Type" 

Voici un résumé de mes modèles:

Modèle Job

class Job < ActiveRecord::Base 
    has_many :jobs_metadata 
    has_many :metadata, :through => :jobs_metadata 

Métadonnées (au singulier des métadonnées) Modèle

class Metadatum < ActiveRecord::Base 
    has_one :metadata_type 
    has_many :jobs_metadata 
    has_many :jobs, :through => :jobs_metadata 

JobMetadatum Modèle < - j'ajouter d'autres champs à cette table, d'où le: par

class JobsMetadatum < ActiveRecord::Base 
    belongs_to :job 
    belongs_to :metadatum 

MetadataType Modèle < --not nécessaire dans l'exemple, mais inclus pour l'exhaustivité

class MetadataType < ActiveRecord::Base 
    has_many :metadata 

Voici le code représentant les boutons radio dans la vue des travaux

Voir le code

<% @job_types.each do |job_type| %> 
    <%= radio_button_tag("job[metadatum_ids]", job_type.id) %> 
    <%= job_type.description %>&nbsp; 
<% end %> 

Quand je sauve la forme - tout semble remplir correctement, mais quand je passe en mode édition, le bouton radio correspondant à la valeur jobs_metadata n'est pas cochée.

Je supposé ma question est double:

  1. Ai-je correctement défini la relation ci-dessus? Est-ce que je fais ça "The Rails Way"? Est-ce que je définis correctement les boutons radio du formulaire - et si oui, comment puis-je les amener à vérifier correctement la valeur lors de la lecture de la base de données?

Répondre

1

Essayez spécifiant la troisième option dans votre appel à radio_button_tag pour le rendre choisi:

<%= radio_button_tag("job[metadatum_ids]", job_type.id, true) %> 

Voir ici pour plus de détails: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-radio_button_tag

Évidemment, vous voulez qu'il soit vrai à base de test , vous pouvez donc définir des méthodes sur votre objet métier comme

def full_time? 
    self.metadata.include?(Metadata.find(1)) 
end 

Et puis:

<%= radio_button_tag("job[metadatum_ids]", job_type.id, job.full_time?) %> 

Mon exemple n'est peut-être pas exactement ce que vous voulez, mais j'espère que vous en aurez l'idée.

+0

Merci! Mais comment ferais-je cela quand je ne connais pas le nombre de valeurs pour les métadonnées? Je parcours une liste de tous les Metadatum de Type "Job Type" afin de générer mes boutons radio (4 d'entre eux). Je ne veux pas créer une méthode pour chaque valeur possible, n'est-ce pas? – cman77