ProgramingTip

Rails : 호출을 호출하지 않고 모델 속성 업데이트

bestdevel 2020. 11. 10. 22:04
반응형

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

반응형