ROR Auto -referencial Has_Many com aceitação_nest_attributes_for
-
20-09-2019 - |
Pergunta
Eu me perguntei se alguém poderia dar uma rápida olhada nisso. Estou fazendo um aplicativo de conversão simples que converte entre unidades de medição. Preciso ser capaz de se auto -referir a tabela usando uma tabela de junção que armazena a relação entre cada uma, juntamente com a conversão entre cada uma. Isso então seria referenciado entre ambos os lados do relacionamento. Por exemplo, 1cm = 10mm e 10mm = 1cm.
Então, até agora eu tenho isso:
#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 %>
Na maioria das vezes, isso funciona bem. Exceto que não posso acessar o nome da medida relacionada, apenas o proprietário.
Eu preciso conseguir de alguma forma assim:
f_r_m.object.related_measure.name
Mas claramente, apesar dos meus melhores esforços, não posso configurá -lo e receber o erro.
undefined method `owner_measure' for #<MeasureMeasure:0x1053139a8>
A ajuda seria muito apreciada. :)
Solução
À primeira vista, o problema vem da definição de muitos temas. Ao não definir a chave estrangeira, os trilhos assumem medir_id na tabela de junção. O que apenas se vincularia à medida que você está tentando encontrá -la.
has_many :measures, :through => :related_measures, :foreign_key => :related_measure_id
Não podemos diagnosticar esse erro sem ver as entranhas do modelo de junção.
f_r_m.object.related_measure
refere -se a ingressar na mesa.
Mas eu suspeito que é porque você não definiu o relacionamento corretamente no modelo de junção. O que deve parecer algo assim:
class MeasureMeasures < ActiveRecord::Base
belongs_to :measure
belongs_to :related_measure, :classname => "Measure"
end