2012-11-09 2 views
0

레일스에서 ​​매우 이상한 문제가 있습니다. 모든 자식 개체를 업데이트하려면 부모 개체에 update_attributes을 사용하고 있습니다. children 객체는 (사용자 정의) 유효성 검사를 수행하며 실제로이 기능은 정상적으로 작동합니다. 즉, 유효성 검사 트리거를 잘못 입력하면 오류가 발생합니다.레일스 update_attributes가 저장 전에 유효성 검사를 호출하는 이유

이제는 모델 중 하나가 데이터베이스에서 유효하지 않은 이상한 상황에 처해 있습니다. 왜 그런지 묻지 마십시오. 데이터베이스에 들어가 SQL을 실행하여 모델을 유효하지 않게 할 수 있습니다. 내 앱에 들어가면 유효하지 않은 값을 볼 수 있으며 괜찮습니다. 값을 수정하고 다시 저장하면 루비 코드에서 스테레오가 새 값을 저장하기 전에 호출된다는 것을 알 수 있습니다. 즉, 오류가 발생하고 레일스가 SQL을 실행하여 실제로 값을 업데이트하지 않습니다. 올바른 것.

나는 위의 의미가되기를 바랍니다. 어떤 생각이 드나요, 아니면 제가 간과하고있는 것이 있다고 생각합니까?

는 해결책 : 무슨 일이 일어 났는지

했다가 다 대다 관계가 새로운 데이터로 대체되기 전에 기존 DB 데이터의 유효성을 검사했다. 기본적 구조는 다음과 같았다 : 나는 독립적 어쨌든 링크 된 기록을 검증하고 이후

class User 
    has_many :user_permissions 
    has_many :permissions, :through => :model_permissions 

class Permission 
    has_many :user_permissions 
    has_many :users, :through => :user_permissions 

class UserPermission 
    belongs_to :user 
    belongs_to :permission 
    validates_associated :user  # THIS was causing the problem 
    validates_associated :permission # and THIS as well 

내가 단순히 validates_associated 지시어를 제거했습니다.

답변

0

글쎄, 레일즈는 데이터를 데이터베이스에 쓰기 전에 (Active Record callback sequence 참조) 유효성 검사 오류가 발생하면 저장하려고하는 일부 모델이 유효하지 않다는 것을 의미합니다. 유효성 검사가 켜져 있거나 일부 누락 된 부분을 포함하는 관련 모델 일 수도 있습니다. 어떤 경우 든 오류가 무엇인지 살펴보십시오.

유효성 검사를 건너 뛰려면 다음 중 하나를 선택하십시오. #update_attribute (하나의 속성 만 업데이트), #save (false) 호출, 모델의 + udpate_all 메소드 사용 클래스 또는 심지어 내려 ActiveRecord :: Base.connection.execute - 이들 중 아무도 유효성 검사 오류와 함께 이제까지 당신을 귀찮게합니다 :)

+0

'그것은 오류가 포함 된 관련 모델 수도 있습니다 .' ... 그것은 올바른 방향으로 나를 가리켰다. 다 대다 링크 테이블은 관련된 모델을 검증하고 있었는데, 여기서 새 데이터를 저장 (및 유효성을 검사)하기 전에 이전 데이터로 유효성을 검사합니다. 내 질문이 업데이트되었습니다. 감사! – Tallmaris

관련 문제