Rails 3 속성이 변경되었는지 확인
Rails 3에서 업데이트하기 전에 속성 블록이 변경되었는지 확인해야합니다.
street1, street2, 도시, 주, 우편 번호
나는 같은 것을 사용할 수 있다는 것을 안다.
if @user.street1 != params[:user][:street1]
then do something....
end
그러나 그 코드는 정말 길다. 더 깨끗한 방법이 있습니까?
ActiveModel :: Dirty를 확인하십시오 (기본적으로 모든 모델에서 사용 가능). 설명서는 정말 좋지만 다음과 같은 작업을 수행 할 수 있습니다.
@user.street1_changed? # => true/false
이것이 여러 속성의 변경 사항을 확인하는 문제를 해결 한 방법입니다.
attrs = ["street1", "street2", "city", "state", "zipcode"]
if (@user.changed & attrs).any?
then do something....
end
이 changed
메소드는 해당 오브젝트에 대해 변경된 속성의 배열을 리턴합니다.
모두 @user.changed
와 attrs
내가 교회법을 얻을 수 있도록 배열이다 (참조 ary & other ary
방법). 교집합의 결과는 배열입니다. any?
배열 을 호출 하면 적어도 하나의 교차점이 있으면 사실입니다.
또한이 changed_attributes
메소드는 원래 값을 가진 속성의 해시를 반환하고 원래 값 changes
과 새로운 값을 가진 속성의 해시 (배열)를 반환합니다.
이 메소드를 지원하는 버전에 대한 APIDock을 확인할 수 있습니다.
http://apidock.com/rails/ActiveModel/Dirty
ActiveModel::Dirty
@model.update_attributes()
변경 사항을 숨겨서 나를 위해 작동하지 않았습니다 . 그래서 이것은 update
컨트롤러 의 메소드에서 변경 사항을 감지 한 방법입니다.
def update
@model = Model.find(params[:id])
detect_changes
if @model.update_attributes(params[:model])
do_stuff if attr_changed?
end
end
private
def detect_changes
@changed = []
@changed << :attr if @model.attr != params[:model][:attr]
end
def attr_changed?
@changed.include :attr
end
많은 속성 변경을 감지하려고하면 지저분해질 수 있습니다. 아마도 컨트롤러 에서이 작업을 수행해서는 안되지만 meh.
레일 5.1+ 콜백
이 게시물을 개선하고 다른 답변을 완료하려면
첫 번째 답변은 다음 레일 버전 (5.1 이후)에서 콜백에 사용되지 않습니다.
속성이 변경되었는지 확인하는 새로운 방법은 saved_change_to_attribute?
넌 할 수있어:
@user.saved_change_to_street1? # => true/false
이 게시물 블로그에서 더 많은 예제를 볼 수 있습니다.
위의 답변이 더 좋지만 지식에 대해서는 또 다른 접근 방식이 있습니다. 개체 (@design)에 대해 'catagory'열 값을 변경하십시오.
@design.changes.has_key?('catagory')
.changes는 키를 열 이름으로, 값을 각 열에 대해 두 개의 값 [old_value, new_value]을 갖는 배열로 해시를 반환합니다. 예를 들어 위의 카테고리는 @design의 'ABC'에서 'XYZ'로 변경되었습니다.
@design.changes # => {}
@design.catagory = 'XYZ'
@design.changes # => { 'catagory' => ['ABC', 'XYZ'] }
참고 URL : https://stackoverflow.com/questions/5051135/rails-3-check-if-attribute-changed
'IT박스' 카테고리의 다른 글
Laravel 4 헬퍼 및 기본 기능에 대한 모범 사례? (0) | 2020.06.13 |
---|---|
C ++을 LR (1) 파서로 파싱 할 수없는 이유는 무엇입니까? (0) | 2020.06.13 |
Twitter Bootstrap 툴팁의 너비와 높이를 어떻게 변경합니까? (0) | 2020.06.13 |
파이썬 팬더 문자열 열의 데이터 선택에서 난 필터링 (0) | 2020.06.13 |
권한 거부 : startForeground에는 android.permission.FOREGROUND_SERVICE가 필요합니다. (0) | 2020.06.13 |