2016-10-13 1 views
1

나는 내가 두 번째 PROC 내 검증 화재에 true있을 때 내 문제는 그검증 문제가

validates :subcategory, presence: true, 
if: Proc.new {|product| product.detail.blank?} && Proc.new { |product| product.category.id != 16 } 

Proc와 검증 및 문제가있는 객체.

왜 그렇습니까? false && true=>false이기 때문에 false을 반환하지 않아야합니까?

답변

4

다른 사람들은 원하는 것을 구현하는 더 나은 방법에 대해 의견을 말했습니다. 네가 가진 오해를 지적 할께.

falsefalse && true => false

때문에 아니를 반환해야합니다. 실제로는 Proc && Proc => Proc (proc1 && proc2 => proc2)입니다. 따라서 첫 번째 proc는 연산자가 작동하는 방식 (이 문제는 클래스 로딩 시간에 발생합니다) 때문에 무시되며 한번도 호출되지 않습니다.

+2

그리고 이것이 진짜 대답이 될 것입니다. –

+0

@ sergio-tulentsev'클래스 로딩 시간 '에서 어떻게 무시되는지 설명해 주시겠습니까? – dnsh

+0

@Dinesh : 그 표현식 ('Proc && Proc')은 그 클래스를 가진 파일이로드 될 때 평가됩니다. 이것은'validates' 호출의 일부이기 때문에 클래스 레벨 표현입니다. 그리고 예, 이것은'validates'가 결코 다시 호출되지 않는다는 것을 의미합니다 (클래스가 이미로드되어 있기 때문에) (* 레일즈의 dev 모드 클래스를 여기에 무관하게 * 다시로드하는 것을 무시합니다). –

5

난 당신이 하나의 PROC 오브젝트를 사용하여 더 좋을 거라고 생각 :

validates :subcategory, 
    presence: true, 
    if: Proc.new { |product| product.detail.blank? && product.category.id != 16 } 
+0

'product.category_id'가 더 좋지 않겠지 만, 카테고리가 없으면 db는 카테고리를로드 할 필요가 없습니다. –

+0

@ j-dexx 그것은 참으로, 나는 OP의 코드를 많이 수정하고 싶지 않았다. :) –

2

나는의 방법을 사용하는 것이 좋습니다 것입니다 경우.

validates :subcategory, presence: true, if: :my_cond? 

def my_cond? 
    detail.blank? && category.id != 16 
end 

코드를보다 명확하게 만듭니다. 방법 my_cond?에 대해 정말로 좋은 이름을 알아 내면 코드가 더 읽기 쉽습니다.

+0

'self'에 대한 필요가 없다. –

+0

@AndreyDeineko 그래. – dnsh