2012-03-29 3 views
0

Ich arbeite an einer Schnitzeljagd App und ich bin fest. Also habe ich den CRUD für die Jagden und für die mit der Jagd verbundenen Aufgaben eingerichtet. Aber ich weiß nicht, wie ich es einrichten soll, damit der Benutzer eine bestimmte Aufgabe einer bestimmten Jagd zuordnen kann. Ich denke, ich habe die Modelle richtig eingerichtet, aber ich bin nicht wirklich sicher, wie man die Ansichten einrichtet, die diese Verbindung von Aufgaben mit einer Jagd erlauben.Brauchen Sie Hilfe beim Verknüpfen von Daten von einem Modell zum anderen

class Hunt < ActiveRecord::Base 

    has_many :tasks 
    attr_accessible :name 
    validates :name, :presence => true, 
        :length => { :maximum => 50 } , 
        :uniqueness => { :case_sensitive => false } 

end 


class Task < ActiveRecord::Base 

    belongs_to :hunts 
    attr_accessible :name 
    validates :name, :presence => true, 
        :length => { :maximum => 50 } , 
        :uniqueness => { :case_sensitive => false } 

end 

Ich schätze, ich brauche eine Ansicht schreiben, die eine Jagd zeigt und dann alle verfügbaren Aufgaben auflistet. Dann brauche ich einen Weg, damit der Benutzer eine Aufgabe "auswählen" und zu einer Jagd hinzufügen kann. Es ist dieser letzte Teil, der mich ratlos macht.

Antwort

1

Einige gute Informationsquellen sind:

  1. Ruby on Rails Guides: ActionView Helpers - gibt einen guten Ausgangspunkt und Übersicht

  2. Blog on dealing with Categories - bespricht mit Kategorien aus der assoziierten Tabelle abgeleitet und sie in der Ansicht präsentiert

  3. Rails Casts Nested Model - dies zeigt, wie mit einer geschachtelten oder has_many-Beziehung umzugehen ist.

auf die Frage ist nun die Aufgabe, das Hinzufügen und die Jagd das Hinzufügen, mit einer Form, die die verschachtelten Attribute verwendet können Sie eine Ansicht, die die Aufgabe zeigt, so dass die Jagd hinzuzufügen. Der Additionsvorgang kann einige Javascript erfordern (wie in Railscasts gezeigt) oder auf andere Weise Popup haben, die einen hunt.tasks.build in der Steuerung ausführt. Der Build auf der Assoziation weist die aktuelle Jagd-ID der erstellten Aufgabe zu.

Nun, wenn Sie auf die Jagd eine Liste von Aufgaben vorbelegt haben müssen Sie das Formular haben, für die Aufgaben, die zu der Jagd die Auswahlliste angezeigt werden soll. Unter Verwendung der verschachtelten Attribute in der Modelldefinition wie in:

class Hunt < ActiveRecord::Base 
    has_many :tasks 
    accepts_nested_attributes_for :tasks 
end 

class Task < ActiveRecord::Base 
    belongs_to :hunts 
end 

So, jetzt auf dem Formular die params vorlegen wird mit der zugehörigen Aufgabe id gebucht werden Ihnen das update_attributes zu tun verschachtelt ermöglicht.

Weitere Details sind in Rails API accepts nested attributes und die Railscast Referenz wird einen Schritt für Schritt Beispiel.

+0

Vielen Dank für alle Ressourcen! –

0

Ihre belongs_to Deklaration in der Task Klasse sollte für :hunt, nicht :hunts sein.

Soweit die Ansicht geht, ist es ziemlich einfach. Verwenden Sie einfach f.select (unter der Annahme, dass Ihr Formular-Helper-Variablenname f ist) unter :hunt_id, und aktualisieren Sie das hunt_id Attribut in Task.

Dies wird die Hunt mit der Task verknüpfen.

Seien Sie sicher, options_for_select zu überprüfen, so dass Sie die Hunt Namen mit dem hunt_id Optionswert in Form anzeigen können. Ich empfehle auch auf Verbände durch die Rails Führung Lesen: http://guides.rubyonrails.org/association_basics.html

2

Ich vermute, ich brauche eine Ansicht zu schreiben, die eine Jagd zeigt und dann listet alle verfügbaren Aufgaben. Dann brauche ich einen Weg, damit der Benutzer eine Aufgabe "auswählen" und zu einer Jagd hinzufügen kann. Es ist dieser letzte Teil, der mich ratlos macht.

impliziert Above, dass es eine has_and_belongs_to_many (*..*) Beziehung zwischen Hunt und Task und nicht has_many (da eine Jagd kann mit mehreren Aufgaben und eine Aufgabe kann in Ihrem System zu mehreren Hunts gehören zugeordnet werden).

könnten Sie gehen mit:

class Hunt < ActiveRecord::Base 
    [...] 
    has_and_belongs_to_many :tasks 
    [...] 
end # Hunt 

class Task < ActiveRecord::Base 
    [...] 
    has_and_belongs_to_many :hunts 
    [...] 
end 

Dadurch wird es Ihnen ermöglichen, mehrere Aufgaben zu verknüpfen (oder Sie könnten nur ein assoziieren, wenn Sie wollen) und auch eine Aufgabe gehören Hunts zu mehr als einer. Außerdem können Sie mit einem einfachen Formular-Helper f.select eine Liste der verfügbaren Aufgaben in Ihrem System rendern.

Hoffe, das hilft.

Verwandte Themen