Rails : 호출을 호출하지 않고 모델 속성 업데이트
: 크레딧 속성이있는 사용자 모델이 있습니다. / users / 3 / add가 사용자 ID = 3의 크레딧에 5를 더할 수있는 "add"라는 경로를 통해 사용자의 여러 버튼을 추가합니다.
def add
@user = User.find(params[:id])
@user.credits += 5
redirect_to root_path
end
그것은 내 컨트롤러의 관련 부분입니다. 문제는 현재 UTC 시간을 기준으로 사용자의 암호를 다시 암호화하는 before_save가 있기 때문에 @ user.save를 호출하고 싶지 않다입니다. 속성에 5를 더하고 싶을뿐입니다. 그런 간단한 일이 그렇게 어렵게 수는 생각하지 않습니다.
편집하다 :
이전을 : before_create로 변경했습니다. 여기에 새 컨트롤러 코드 (관련 부분)가 있습니다.
def add
@user = User.find(params[:id])
@user.add_credits(5)
@user.save
flash[:success] = "Credits added!"
redirect_to root_path
end
다음은 모델의 코드입니다.
def add_credits(num)
self.credits = num
end
편집 2 :
좋습니다. "EDIT"의 변경 사항이 작동하지 않는 유효성 검사 문제지만 대답없이 업데이트하는 원래 질문에 대한 답변을 여전히 원합니다!
Rails 3.1이 도입되었습니다. 이는 update_column
동일 update_attribute
하지만 유효성 검사 또는 트리거하지 않습니다.
http://apidock.com/rails/ActiveRecord/Persistence/update_column
여러 가지 속성을 업데이트 할 수 있습니다. 다음과 같이 사용할 수 있습니다.
self.class.update_all({name: value, name: value}, self.class.primary_key => id)
충실한 update_columns 메소드도 시도해보고이를 활성 레코드베이스 클래스에 혼합 할 수도 있습니다.
하나의 속성을 업데이트하려는 경우 update_column을 사용할 수 있습니다. 또한 Rails 가이드 http://guides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks 에서 사용할 수있는 몇 가지 특정 방법이 있습니다.
일반적인 대답으로 Rails 4에서 발생하는 트리거를 트리거하지 않고 업데이트하는 간단한 방법입니다.
@user.update_column 'credits', 5
트리거 번거 로움 여러 속성을 업데이트해야하는 경우 :
@user.update_columns credits: 5, bankrupt: false
원하는 경우 Rails 가이드에 다른 옵션 이 방법이 가장 쉬운 방법이라는 것을 알았습니다.
이 경우 update_counters 메소드를 사용하여 생각합니다 . 컨트롤러 작업에서 다음과 같이 사용하십시오.
def add
User.update_counters params[:id], :credits => 5
redirect_to root_path
end
트리거 트리거를 방지 하려면 update_all 을 사용할 수 있어야합니다 .
def add
@user = User.find(params[:id])
User.where(:id=>@user.id).update_all(:credits => @user.credits+5)
redirect_to root_path
end
이 논리를 모델에 넣는 것이 선호하지만 컨트롤러에 사양에 따라 원래 문제를 해결하는 데 작동합니다.
rails4 http://edgeguides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks 에서이를 수행하는 방법에 대한 몇 가지 옵션
mongoid의 경우 http://mongoid.org/en/mongoid/docs/persistence.html 특히 다음을 사용할 수 있습니다.
person.set(name:"Robert Pulson")
콜백이 발행되지 않습니다. 너무 멋지다.
다른 before_save 후크는 다시 암호화하기 전에 사용자의 암호가 실제로 변경되었는지 확인해야합니다.
사용하는 콜백 변경 (예 : after_create
.
콜백을 트리거하지 않고 열을 업데이트 할 수 있습니다 . AR 가이드의 콜백 건너 뛰기를 참조하세요 . 예를 들어 update_column
콜백을 트리거하지 않습니다. 이전 링크는 트리거되지 않는 기능을 나열합니다.
또한 어떤 사용할 수있는 조건부 콜백 암호가 변경 될 때를 위해 양식 (또는 관찰자). 참조 ActiveModel :: 더러운 , 예를 @user.password_changed?
.
이 작업을 수행하여 열을 업데이트 할 수 있습니다.
User.where (name : 'lily') .update_all (age : '10')
참고 URL : https://stackoverflow.com/questions/8650983/rails-update-model-attribute-without-invoking-callbacks
'ProgramingTip' 카테고리의 다른 글
PHP를 사용하여 다음 문자를 가장 쉽게 사용하는 방법 (0) | 2020.11.10 |
---|---|
PowerShell에서 출력을 $ null로 리디렉션하지만 변수가 설정되어 있는지 확인 (0) | 2020.11.10 |
PHPStorm의 코드 검사에서 파일 / 폴더를 제외하는 방법은 무엇입니까? (0) | 2020.11.10 |
Firefox의 범위 입력 요소에서 점선 윤곽선 제거 (0) | 2020.11.10 |
vscode의 모든 줄에서 커서를 얻는 방법 (0) | 2020.11.10 |