2009-10-23 2 views
0

Salut les gars. Je suis novice dans le développement des rails et je suis tombé sur un mur. L'application sur laquelle je travaille est une solution d'ordonnancement qui nécessite la mise à jour d'un modèle de jointure, mais pas d'une manière simple 1: 1.Mise à jour d'un formulaire en 2 dimensions

L'application est aménagé comme suit:

class Route < ActiveRecord::Base 
    has_many :markers, :foreign_key => 'source_id' 
    has_many :schedules 

    accepts_nested_attributes_for :markers, :allow_destroy => true, :reject_if => proc { |a| a['name'].blank? } 
    accepts_nested_attributes_for :schedules, :allow_destroy => true, :reject_if => proc { |a| a['name'].blank? } 
end 

class Schedule < ActiveRecord::Base 
    has_many :arrivals 
    has_many :markers, :through => :arrivals 

    accepts_nested_attributes_for :arrivals, :allow_destroy => true, :reject_if => :all_blank 
end 

class Marker < ActiveRecord::Base 
    has_many :arrivals 
    has_many :schedules, :through => :arrivals 
end 

class Arrival < ActiveRecord::Base 
    belongs_to :marker 
    belongs_to :schedule 
end 

... donc un has_many de base: par ... ou alors je pense: P

Lorsque vous créez un itinéraire, vous pouvez créer des horaires 1..n et des marqueurs 1..n. La modification d'une planification devrait vous permettre d'ajouter des entrées d'arrivée 1..n pour chaque marqueur défini dans l'itinéraire. C'est ce qui me cause du chagrin.

Grâce à la magie de ascii-art, ce que je veux l'application pour ressembler à:

/views/routes/edit.html.erb (works already) 

ROUTE 
----- 
... 

SCHEDULES 
--------- 
[Add] 

* Schedule 1 [Edit][Delete] 
* Schedule 2 [Edit][Delete] 
... 

MARKERS 
------- 
[Add] 

* Marker 1 [Edit][Delete] 
* Marker 2 [Edit][Delete] 
* Marker 3 [Edit][Delete] 
* Marker 4 [Edit][Delete] 
... 

/views/schedules/edit.html.erb 

SCHEDULE X 
---------- 
[Add Col.] 

Marker 1 [ ] [ ] 
Marker 2 [ ] [ ] 
Marker 3 [ ] [ ] 
Marker 4 [ ] [ ] 
     [x] [x] 

(the [x] should remove a column) 

EDIT (09NOV04):

J'ai supprimé le code de la vue incomplète que j'avais à l'origine posté, mais j'aimerais mettre à jour la question un peu.

Je pense qu'une partie de la confusion ici (pour moi-même, et peut-être pour quelqu'un qui pourrait être en mesure d'aider) est que je n'ai pas expliqué les relations correctement.

  1. marqueurs ont beaucoup d'arrivées
  2. horaires ont de nombreux marqueurs
  3. routes ont beaucoup horaires

Ce sont les bases. Avoir un formulaire qui mettrait à jour les arrivées pour un marqueur unique ne serait pas difficile, car c'est une forme basique. Ce que j'espère faire est de fournir un formulaire qui met à jour tous les marqueurs en même temps.

Lorsque vous cliquez sur "Ajouter une entrée", vous devez ajouter une nouvelle arrivée pour chaque marqueur actuellement disponible. Sous chaque "colonne", il devrait y avoir un bouton "supprimer", qui va supprimer chaque arrivée pour cette colonne particulière (donc de chaque marqueur).

Je ne suis pas sûr si cela clarifie les choses tout: P

Répondre

1

Lorsque vous créez un itinéraire, vous pouvez créer des horaires de 1..n et 1..n marqueurs. Si vous modifiez un programme, vous permet d'ajouter les entrées d'arrivée 1..n pour chaque marqueur défini dans l'itinéraire. CECI est ce qui me cause le chagrin.

Il n'y a rien de lier des marqueurs aux itinéraires en ce qui concerne les horaires. La manière dont vous avez défini les horaires peut ajouter n'importe quelle entrée d'arrivée pour chaque marqueur défini dans votre base de données.

Vous avez besoin de faire quelques changements pour obtenir la fonctionnalité que vous voulez. Je suppose qu'un horaire appartient à un itinéraire. J'ai également omis les attributs accept_nested_attributes_for pour conserver l'espace.

class Route < ActiveRecord::Base 
    has_many :markers, :foreign_key => 'source_id' 
    has_many :schedules 
    ... 
end 

class Schedule < ActiveRecord::Base 
    has_many :arrivals 
    belongs_to :route 
    has_many :markers, :through => :arrivals 
    has_many :route_markers, :through => :route, :source => :markers 
    ... 
end 

class Marker < ActiveRecord::Base 
    has_many :arrivals 
    has_many :schedules, :through => :arrivals 
    ... 
end 

class Arrival < ActiveRecord::Base 
    belongs_to :marker 
    belongs_to :schedule 
    ... 
end 

maintenant @schedule.route_markers renvoie une liste de marqueurs dans la route liée au calendrier. Vous pouvez les utiliser pour générer votre grille. Créez ensuite des objets d'arrivée pour établir un marqueur dans un planning spécifique.

Ensuite, c'est juste une question de @schedule.markers= list_of_markers et les rails prend soin de créer/supprimer des entrées dans la table de jointure.

Désolé mais sans en savoir plus, je ne vais pas spéculer sur ce à quoi ressemblera la vue.

+0

Maintenant que j'ai route_markers, je peux obtenir les marqueurs dans mon contrôleur en faisant un @ schedule.route_markers.find (: all), et l'utiliser pour construire la liste dans la vue. C'est ce que j'essaie de faire qui me gêne un peu. J'utilise la liste des marqueurs pour construire une table simple. Chaque "rangée" devrait représenter un certain nombre d'entrées d'arrivée pour un marqueur particulier. J'utilise l'exemple "complex-forms" pour configurer l'ajout dynamique de "colonnes", mais je ne suis pas sûr de savoir comment configurer cette partie pour la saisie et l'édition. J'ai une configuration de vue "idéale" dans le post original si cela aide. –

+0

Je ne comprends pas ce que vos colonnes sont censées représenter. Est-ce que chaque colonne est supposée être une arrivée? Parce que la façon dont les choses sont disposées maintenant, il n'y a aucun moyen d'associer plusieurs arrivées pour un marqueur. Pourriez-vous mettre à jour votre question avec une meilleure explication du formulaire? – EmFi

+0

Hey Emfi, Ce que j'essaie de faire est la suivante: Chaque marqueur peut avoir plusieurs arrivées. Ce que je veux faire, c'est pouvoir ajouter une nouvelle "colonne" d'arrivées basée sur le nombre de marqueurs disponibles. Je pense que c'est là que ça devient salissant. Vous ne devriez pas être en mesure d'ajouter des entrées "uniques" à la fois, bien que techniquement, c'est comme cela que cela sera stocké dans la base de données. L'utilisation est la suivante: Si vous avez des marqueurs appelés Point1, Point2 ... Pointn, lorsque vous cliquez sur "Ajouter", vous devez générer des champs pour CHAQUE marqueur, et chaque champ représente une arrivée. –

Questions connexes