ROR Self Referential Has_many через ACCEST_NEDEST_ATTRIBUTES_FOR
-
20-09-2019 - |
Вопрос
Я задавался вопросом, сможет ли кто -нибудь быстро взглянуть на это. Я делаю простое применение преобразования, которое преобразует между единицами измерения. Мне нужно иметь возможность самозаправить таблицу, используя таблицу соединений, в которой хранится взаимосвязь между каждым, наряду с конверсией между каждым. Это будет упоминаться между любой стороной отношений. Например, 1 см = 10 мм и 10 мм = 1 см.
До сих пор у меня есть это:
#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 %>
По большей части это работает нормально. За исключением того, что я не могу получить доступ к имени соответствующей меры, только владельца.
Мне нужно так или иначе это:
f_r_m.object.related_measure.name
Но, очевидно, несмотря на все мои усилия, я не могу настроить и получить ошибку.
undefined method `owner_measure' for #<MeasureMeasure:0x1053139a8>
Помощь была бы очень оценена. :)
Решение
На первый взгляд проблема возникает из -за того, что есть много через определение. Неспособность определить внешний ключ, Rails, предполагает меру_ид в таблице соединений. Что просто ссылается на меру, из которой вы пытаетесь найти ее.
has_many :measures, :through => :related_measures, :foreign_key => :related_measure_id
Мы не можем диагностировать эту ошибку, не видя внутренности модели соединения.
f_r_m.object.related_measure
относится к таблице присоединения.
Но я подозреваю, что это потому, что вы не определили отношения должным образом в модели соединения. Что должно выглядеть примерно так:
class MeasureMeasures < ActiveRecord::Base
belongs_to :measure
belongs_to :related_measure, :classname => "Measure"
end