Accepts_nested_attributes_for와 함께 ROR 공장 협회를 어떻게 만들 수 있습니까?

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

문제

Anton이 지적했듯이 (Anton에게 감사합니다!) 내 문제는 테스트에서 협회 캐싱이며 공장에서 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 내 직업 모델에서 모델을 변경할 때마다 내 대리석 "Fixture Diving"을 거의 잃은 후 공장 소녀로 마이그레이션하려고합니다.

아래에 많은 코드를 게시했지만 내 질문은 간단합니다.

공장을 사용하여 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 a job 1 단계에서 객체.
따라서 필요한 것은 다시로드하는 것입니다 job:

vehicle = Factory(:vehicle)
vehicle.job.reload.vehicles.size # => 2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top