저장하지 않고 ActiveRecord 모델에 값을 대량으로 할당하려면 assign_attributes
또는attributes=
메소드를 사용하십시오. 이러한 방법은 Rails 3 이상에서 사용할 수 있습니다. 그러나 알아야 할 사소한 차이점과 버전 관련 문제가 있습니다.
두 방법 모두이 사용법을 따릅니다.
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
어떤 메소드도 유효성 검사를 수행하거나 콜백을 실행하지 않습니다. 콜백 및 유효성 검사는save
는 호출 합니다.
레일 3
attributes=
assign_attributes
Rails 3 과 약간 다릅니다. attributes=
전달 된 인수가 해시인지 확인하고 그렇지 않으면 즉시 반환합니다. assign_attributes
해시 확인이 없습니다. 에 대한 ActiveRecord 속성 할당 API 설명서를attributes=
참조하십시오 .
다음과 같은 잘못된 코드는 속성을 설정하지 않고 단순히 반환하면 자동으로 실패합니다.
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
과제가 성공적으로 수행 된 것처럼, 실제로는 그렇지 않은 것처럼 자동으로 작동합니다.
이 잘못된 코드는 assign_attributes
둘러싸는 배열의 해시 키를 문자열 화하려고 할 때 예외를 발생 시킵니다.
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
에 대한 NoMethodError
예외 가 발생 stringify_keys
하여 첫 번째 인수가 해시가 아님을 나타냅니다. 예외 자체는 실제 원인에 대한 정보가 많지 않지만 예외가 발생한다는 사실은 매우 중요합니다. 중요합니다.
이러한 경우의 유일한 차이점은 대량 할당에 사용 된 방법입니다. attributes=
자동으로 성공 assign_attributes
하고 오류가 발생했음을 알리는 예외를 발생시킵니다.
이 예제는 생각한 것처럼 보일 수 있지만 어느 정도는 오류가 있지만 API에서 데이터를 변환하거나 일련의 데이터 변환 Hash[]
을 사용하고 final의 결과를 잊어 버릴 때 이러한 유형의 오류가 쉽게 발생할 수 있습니다 .map
. 위 코드를 50 줄 이상 유지하고 속성 할당에서 3 개의 기능을 제거하면 실패 할 수 있습니다.
Rails 3의 교훈은 이것입니다. 항상assign_attributes
대신에 사용하십시오 attributes=
.
레일 4
Rails 4에서는 attributes=
단순히에 대한 별칭 assign_attributes
입니다. 에 대한 ActiveRecord 속성 할당 API 설명서를attributes=
참조하십시오 .
Rails 4에서는 두 가지 방법을 서로 바꿔 사용할 수 있습니다. 첫 번째 인수로 해시를 전달하지 않으면 매우 유용한 예외가 발생합니다.ArgumentError: When assigning attributes, you must pass a hash as an argument.
검증
을 (를) 준비하기 위해 사전 비행 과제를 수행하는 save
경우 저장하기 전에 유효성 검사에 관심이있을 수 있습니다. 이를 위해 valid?
및 invalid?
방법을 사용할 수 있습니다 . 둘 다 부울 값을 반환합니다. valid?
저장되지 않은 모델이 모든 유효성 검사를 통과하면 true를 반환하고 그렇지 않으면 false를 반환합니다. invalid?
단순히 역의valid?
valid?
다음과 같이 사용할 수 있습니다 :
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
이를 통해 전화하기 전에 모든 검증 문제를 처리 할 수 있습니다 save
.