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.
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
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. –
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