2012-03-26 2 views
0

Ich habe wirklich Schwierigkeiten, mich mit dem Problem zu beschäftigen, das Attribut in meinem Join-Modell zu setzen.Wie interagieren eine has_many: through-Assoziation und ihr Join-Model-Attribut?

Meine Modelle:

class Contract < AR::Base 
    has_many :codelines 
    has_many :codes, :through => :codelines 

    accepts_nested_attributes_for :codes 

    attr_accessible :codes_attributes, :codes; :authnum, :st_date, :end_date 
    end 

    class Codeline < AR::Base 
    belongs_to :contract 
    belongs_to :code 
    units_alloc ...... this is the attribute I would like to set 
    end 

    class Code < AR::Base 
    has_many :codelines 
    has_many :contracts, :through => :codelines 
    end 

Die neue Aktion meiner app/controllers/contracts_controller.rb

def new 
    @contract = Contract.new 
    @contract.codes.build 
    end 

die teilweise für meine Ansicht in app/views/Verträge/_fields.html.haml

<fieldset><legend>Enter Billing Code Details</legend> 
    = f.fields_for :codes do |ff| 
    .field 
     = ff.label :name, "Code Name" 
     %br/ 
     = ff.text_field :code_name 
    .field 
    . 
    . 
    = f.fields_for :codelines do |ff| 
    .field 
     = ff.label :name, "Units Alloc" 
     %br/ 
     = ff.text_field :units_alloc, :precision => 6, :scale => 2, :size => 10 
    </fieldset> 

Von Rails Guides lesen und Railscasts # 196 und # 197 beobachten und geschachtelte Attribute untersuchen im Internet kam ich zu dem Verständnis, dass die @ contract.codes.build Zeile in der neuen Aktion meiner App/controllers/contracts_controller.rb nicht nur das Code-Objekt, sondern auch das Codelines-Objekt gebaut. Wenn ich meine neue Aktion meiner App/controllers/contracts_controller.rb wie oben beschrieben verlasse, passiert genau das. Meine Codezeilen Tabelle aufgefüllt wird, wie folgt:

id  contract_id  code_id  units_alloc 
    1    1    1     .... @contract.codes.build 

Aber wenn man sich meiner Meinung nach aussehen würde ich wirklich gerne units_alloc und diese Zeile @ contract.codes.build gesetzt gibt mir nicht den Zugang zu units_alloc da es im Codeline-Modell. Ich habe @ contract.codelines.build zu der neuen Aktion meiner app/controllers/contracts_controller.rb hinzugefügt und jetzt zeigt das units_alloc aus meiner Sicht und ich kann es einstellen. Aber jetzt habe ich zwei Zeilen in meiner Codelines-Tabelle. Ein aus den @ contract.codes.build resultierenden wo sowohl das Codeobjekt und Objektentwicklungspfad aufgebaut sind und die zweite Reihe ist als Ergebnis der @ contract.codelines.build und meine Codezeilen-Tabelle ist wie folgt:

Sollte ich nicht in der Lage sein, durch den ersten Build von @ contract.codes.build Zugriff auf units_alloc zu bekommen, wo sowohl das Code-Objekt als auch das Codeline-Objekt erstellt wird?

Weiß jemand, ob mein Verständnis dieses Problems korrekt ist, oder könnten Sie mich auf eine Ressource hinweisen, wo alles aufgedeckt wird?

Genau wie ein Nachdenken baute ich das Code-Objekt durch Codezeilen und ich bekam das gleiche Ergebnis.

Vielen Dank für Anregungen.

aktualisieren Ich kann meine Codezeilen Tisch bekommen nur einen Datensatz mit allen dazugehörigen haben id gesetzt ist wie folgt:

Meine Konsole:

@contract = Contract.new(authnum: "900700", st_date: "2012-01-01", end_date: 
    "2012-30-06") 

    @contract.save 

    @code = Code.new(code_name: "S-5463", status: "Active", description: 
    "This and That") 

    @code.save 

    @codeline = @code.codelines.build(:units_alloc => "80.00", :contract => @contract) 

    @codeline.save 

    @codeline 
    => #<Codeline id: 91, contract_id: 64, code_id: 54, units_alloc: 80.00> 

Mit pgadmin3 prüfe ich meine Codezeilen Tisch und ich bekomme nur einen Datensatz, nämlich:

id contract_id code_id units_alloc 
    91   64   54  80.00 

nun der Test ist mein contracts_con zu bekommen Troller neu/Aktion erstellen, um das gleiche zu tun.

Antwort

0

gespeichert fand ich an dieser Stelle eine Lösung, debugging nested_forms.

Es ist das neunte Geschoss nach unten, wo Sie gelesen haben, dass wenn Sie mit einer has_many: through-Assoziation arbeiten, Sie Ihre nested_form auf dem Join-Modell oder etwas in der Nähe davon basieren müssen.

Ich habe schnell einen Test durch Refactoring einige Code hier und da durchgeführt und ich habe jetzt eine praktikable geschachtelte Form, die die richtigen Parameter an die Steuerung serviert, die wiederum verarbeitet es richtig und meine Codelines-Tabelle hat jetzt nur einen Datensatz.

0

Für den neuen,

Ein bestehender Vertrag mit einem bestehenden Code. Binde sie zusammen.

einen Entwicklungspfad erstellen, diese beiden IDs und die units_alloc

codeline.contract = contract 
codeline.code = code 
codeline.units_alloc = 1 

codeline.save 

Wenn Sie anzeigen möchten

Codeline.all


Wenn Sie Gebrauch verwenden, haben eine neue Liste von Objekten, die Sie wollen im laufenden Betrieb zu erstellen, wie Array.new

post.comments.build 

um ein neues Array von leeren Kommentaren für meinen Beitrag zu erstellen, anstatt es zu sein

Ich hoffe, das hilft. Ich bin neu in Schienen.

bearbeiten

Zum ersten Mal besucht die Seite der App versuchen, einen neuen Entwicklungspfad zu erstellen, bis es

@codeline = Codeline.new 
@codeline.contract = Contract.new #or find it from the table, depends on the logic 
@codeline.code = Code.new 
@codeline.units_alloc = 0 #default value 
+0

Danke @ D3mon-1stVFW, setze ich den Code line.contract = Vertrag in meine create-Aktion meiner contracts_controller. Ist auch die codeline.units_alloc = 1 ein boolescher Wert? – thomasvermaak

+0

Die Art, wie ich es sehe, ist, wenn sie eine Codezeile erstellen, sie aus einem bestehenden Vertrag & Code auswählen. Ansonsten können sie basierend auf der Logik entweder im laufenden Betrieb erstellt werden oder sie können aus der Tabelle gefunden werden. Der Controller für diese Seite wird basierend auf den Pfaden festgelegt. Ich sehe es im Codeline-Controller. Die Einheitenzuordnung ist nur eine Zahl, kein Boolescher Wert. –

+0

Nochmals vielen Dank ... Ich muss jetzt laufen, aber ich werde mit diesem morgen spielen und dann Ihre Antwort als Antwort markieren ... toll, jemanden zu treffen, der neu ist auf Schienen ... wenn auch fortgeschrittener als ich :) – thomasvermaak

Verwandte Themen