ROR auto referenziale has_many attraverso con accept_nested_attributes_for
-
20-09-2019 - |
Domanda
Mi chiedevo se qualcuno potrebbe prendere un rapido sguardo a questo. Sto facendo una semplice applicazione di conversione che converte tra unità di misura. Ho bisogno di essere in grado di auto riferimento alla tabella utilizzando una tabella che memorizza la relazione tra ciascuno, insieme con la conversione tra ogni join. Questo allora dovrebbe essere indicata tra entrambi i lati della relazione. Per esempio 1 centimetro = 10mm e 10 mm = 1 centimetro.
Quindi finora ho questo:
#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 %>
Per la maggior parte questo funziona bene. Solo che non posso accedere al nome del relativo provvedimento, solo il proprietario.
ho bisogno di ottenere in qualche modo simile a questo:
f_r_m.object.related_measure.name
ma è chiaro che nonostante i miei sforzi non riesco a configurarlo e ricevere l'errore.
undefined method `owner_measure' for #<MeasureMeasure:0x1053139a8>
Aiuto sarebbe molto apprezzato. :)
Soluzione
A prima vista il problema deriva dal ha molti attraverso la definizione. Avendo definito la chiave esterna, ringhiere, assume measure_id nella tabella join. Il che sarebbe solo un collegamento alla misura che si sta cercando di trovare da.
has_many :measures, :through => :related_measures, :foreign_key => :related_measure_id
Non possiamo diagnosticare questo errore senza vedere l'interno del modello di aderire.
f_r_m.object.related_measure
si riferisce a unirsi a tavola.
Ma ho il sospetto che sia perché non è stata definita la relazione correttamente nel modello di aderire. Quale dovrebbe essere simile a questo:
class MeasureMeasures < ActiveRecord::Base
belongs_to :measure
belongs_to :related_measure, :classname => "Measure"
end