ROR Selbstreferenzielle has_many durch mit take_nested_attributes_for
-
20-09-2019 - |
Frage
Ich fragte mich, ob sich das jemand kurz ansehen könnte.Ich erstelle eine einfache Konvertierungsanwendung, die zwischen Maßeinheiten umrechnet.Ich muss in der Lage sein, die Tabelle selbst zu referenzieren, indem ich eine Join-Tabelle verwende, die die Beziehung zwischen den einzelnen Tabellen sowie die Konvertierung zwischen den einzelnen Tabellen speichert.Darauf würde dann zwischen beiden Seiten der Beziehung verwiesen.Zum Beispiel 1 cm = 10 mm und 10 mm = 1 cm.
Bisher habe ich Folgendes:
#migrations
create_table :measures do |t|
t.string :name
end
create_table :measure_measures do |t|
t.integer :measure_id
t.integer :related_measure_id
t.integer :conversion
end
class Measure < ActiveRecord::Base
has_many :related_measures,
:foreign_key => 'measure_id',
:class_name => 'MeasureMeasure',
:dependent => :destroy
has_many :measures, :through => :related_measures
accepts_nested_attributes_for :related_measures,
:reject_if => proc { |attrs| attrs['related_measure_id'].blank? ||
attrs['quantity'].blank? },
:allow_destroy => true
end
#controller
@measure = Measure.find params[:id
#form
<% form_for @measure do |f| %>
<% fields_for :related_measures do |f_r_m| %>
<%= f_r_m.text_field :related_measure_id -%>
<%= f_r_m.text_field :quantity -%>
<% end %>
<% end %>
Meistens funktioniert das gut.Allerdings kann ich nicht auf den Namen der zugehörigen Maßnahme zugreifen, sondern nur auf den Eigentümer.
Ich muss es irgendwie so hinbekommen:
f_r_m.object.related_measure.name
Aber offensichtlich kann ich es trotz meiner besten Bemühungen nicht einrichten und erhalte die Fehlermeldung.
undefined method `owner_measure' for #<MeasureMeasure:0x1053139a8>
Hilfe wäre sehr dankbar.:) :)
Lösung
Auf den ersten Blick liegt das Problem darin, dass es viele Definitionen gibt.Da der Fremdschlüssel nicht definiert werden kann, geht Rails davon aus, dass „measure_id“ in der Join-Tabelle enthalten ist.Das würde einfach auf die Kennzahl verweisen, anhand derer Sie es finden möchten.
has_many :measures, :through => :related_measures, :foreign_key => :related_measure_id
Wir können diesen Fehler nicht diagnostizieren, ohne die inneren Abläufe des Join-Modells zu kennen.
f_r_m.object.related_measure
bezieht sich auf die Join-Tabelle.
Aber ich vermute, dass es daran liegt, dass Sie die Beziehung im Join-Modell nicht richtig definiert haben.Was etwa so aussehen sollte:
class MeasureMeasures < ActiveRecord::Base
belongs_to :measure
belongs_to :related_measure, :classname => "Measure"
end