كيف يمكنك إنشاء RoR مصنع الجمعيات مع accepts_nested_attributes_for?
-
06-07-2019 - |
سؤال
كما انطون نقاط من أصل (شكرا انطون!) مشكلتي هي جمعية التخزين المؤقت في الاختبارات و يبدو كما فعلت بشكل صحيح إنشاء 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