ROR ذاتي المرجع HAS_MANY من خلال مع قبول_nted_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 measure_id في جدول الانضمام. الذي سيؤدي إلى الارتباط مرة أخرى إلى التدبير الذي تحاول العثور عليه منه.
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