كيف يمكنك إنشاء RoR مصنع الجمعيات مع accepts_nested_attributes_for?

StackOverflow https://stackoverflow.com/questions/1010532

سؤال

كما انطون نقاط من أصل (شكرا انطون!) مشكلتي هي جمعية التخزين المؤقت في الاختبارات و يبدو كما فعلت بشكل صحيح إنشاء nested_attribute في المصنع.بناء الجملة الصحيح هو:

Factory.define :job do |f|
  ...
  f.vehicles_attributes [{:vin => "1", :model => "ford", :make => "escort"},{:vin => "1", :model => "ford", :make => "escort" }]
end

أنا باستخدام accepts_nested__attributes_for في نموذج عملي و أحاول أن تهاجر إلى فتاة المصنع بعد ما يقرب من أفقد صوابي "اساسيا الغوص" في كل مرة قمت بتغيير نموذج.

نشرت لي مجموعة من التعليمات البرمجية أدناه ولكن سؤالي واضح وصريح:

كيف يمكنني استخدام المصانع لإنشاء nested_attributes?

أنا قادرة على خلق وظيفة سبيل المثال باستخدام التعليمات البرمجية أدناه ولكن أنا لا يمكن إنشاء إنشاء المركبات في وحدة الاختبارات.دون f.vehicles_attributes... عملي الاختبارات تفشل التصديقات.

الاختبارات وحدتي إنتاج النتائج التالية:

  test "factory" do
    job = Factory(:job)
    assert(job.valid?)  # => true
    assert(job.vehicles.first.valid?) # => true
    vehicle = Factory(:vehicle)
    assert(vehicle.job.vehicles.size == 1) # => true
    assert_equal(vehicle.job.vehicles.first.vin, "2") # => FALSE.  <"1"> expected but was <"2">
  end

Factory.define :job do |f|
  ...
  f.vehicles_attributes [:vin => "1", :model => "ford", :make => "escort" ]
end

Factory.define :vehicle do |f|
  f.vin "2"
  f.model "ford"
  f.make "escort"
  f.association :job
end

class Job < ActiveRecord::Base
  has_many :vehicles, :dependent => :destroy
  validate :job_must_have_at_least_one_vehicle
  accepts_nested_attributes_for :vehicles, :allow_destroy => :true, :reject_if => proc { |vehicle_attributes| Job.insufficient_vehicle_input?(vehicle_attributes) }

  def job_must_have_at_least_one_vehicle
    errors.add(:vehicles, "need to be added") if self.vehicles.empty?
  end

  def self.insufficient_vehicle_input?(vehicle_attributes)
    vehicle_property_keys = vehicle_attributes.keys
    vehicle_property_keys.delete('_delete')
    vehicle_property_keys.delete('is_operational')
    vehicle_property_keys.delete('has_keys')
    vehicle_property_keys.each do |attribute_to_validate|
      if(!vehicle_attributes[attribute_to_validate].nil? && !vehicle_attributes[attribute_to_validate].empty?)
        return false
      end
    end
    return true
  end
end
هل كانت مفيدة؟

المحلول

ذلك هو كل شيء عن جمعية التخزين المؤقت.

هنا هو كيف يعمل:
1. Factory(:vehicle) يبني vehicle موضوع يخلق job سجل
2.بعد أن يملأ vehicle.job_id وحفظه

ولكن vehicle.job وأشار أ job كائن من الخطوة 1.
لذا كل ما عليك هو تحميل job:

vehicle = Factory(:vehicle)
vehicle.job.reload.vehicles.size # => 2
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top