1

현재 다이어트 용 추적 앱을 개발 중입니다. 각 인스턴스가 다른 테이블에서 하나의 food을 참조하고 또 하나의 테이블에서 measurement의 단위를 참조하는 FoodEntry 모델이 있습니다.레일에서 관련 모델 확인

잘 작동하지만, 특정 food과 관련된 것으로 (I 외부 데이터와 함께 일하고 있어요 때문에) 물건이 measurements 테이블의 각 항목이 설정되어 있다는 점이다
class FoodEntry < ActiveRecord::Base 
    belongs_to :food 
    belongs_to :measurement 
    validates :food, presence: { message: 'must exist' } 
    ... 
end 

즉 측정은 식품에 속한다 그리고 음식은 많은 측정이 있습니다

class Food < ActiveRecord::Base 
    has_many :measurements 
    ... 
end 

class Measurement < ActiveRecord::Base 
    belongs_to :food 
    ... 
end 

내 질문은, 내가 food_entry에 참조하고있어 특정 measurement은 또한 food.measurements 중 하나입니다 확인하는 올바른 방법은 무엇입니까?

validate :measurement_must_be_associated 

def measurement_must_be_associated 
    unless food.measurements.include? measure 
    errors.add(:measurement, 'is not associated with that food') 
    end 
end 

이 지정 유효성 검사가 작동하지만, 나는 그것을 할 수있는 가장 깨끗한 방법 확실하지 않다 :

현재 내 FoodEntry 모델에서 나는이 일을하고 있습니다.

내가 대신이 일을 시도 :

validates :measurement, inclusion: { in: food.measurements } 

를하지만 나에게 레일 콘솔에서 FoodEntry.new(food_id: 1, measurement_id: 1)를 호출하는 오류를 제공합니다 (실제 id들 무관) :

NameError: undefined local variable or method `food' for FoodEntry (no database connection):Class 

in: self.food.measurements 사용 검증은 아무런 차이를 만들지 않았습니다. 도움?

답변

3

시도 :

validates :measurement, inclusion: { in: ->(record) { record.food.measurements } } 

validates는 클래스에 정의 된 방법이며, 클래스가 선언 될 때 평가되고있다. 일반적으로 프로그램이 시작되기 전에 포함 값이 알려지고 정적 인 경우 전달 값은 충분합니다. 유효성 검사기 (validates이 호출 될 때 생성 됨)는 전달 된 객체를 저장하고 유효성 검사시이를 사용합니다.

경우에 따라 유효성 검사기가 생성 될 때 포함 값은 알 수없고 유효성 검사기 개체에 따라 다릅니다. 따라서 람다를 전달해야하므로 유효성 검사기는 런타임 중에 포함 값을 가져올 수 있습니다.

또한 validator 객체는 특정 인스턴스가 아닌 클래스에 연결되므로 람다에 record param이 있어야합니다.