[ruby-on-rails] Rails에서 속성의 원래 값을 얻는 방법
ActiveRecord 속성 (= 데이터베이스에서로드 된 값)의 원래 값을 가져 오는 방법이 있습니까?
나는 관찰자에게 이런 것을 원한다
before_save object
do_something_with object.original_name
end
작업은 업데이트시 해시 테이블에서 개체를 제거하는 것입니다 (실제로 테이블의 다른 키로 이동).
답변
레일 5.1 이전
_was
속성에 추가 하면 이전 값이 제공됩니다.
레일 5.1 이상
아래의 Lucas Andrade의 답변에서 복사되었습니다 : https://stackoverflow.com/a/50973808/9359123
추가 _was
는 rails 5.1에서 더 이상 사용되지 않습니다. 이제 다음을 추가해야합니다._before_last_save
다음과 같은 것 :
before_save object
do_something_with object.name_before_last_save
end
데이터베이스에 저장 마지막 전에 이름 값을 반환합니다 (저장 및 생성 작동)
의 차이 사이 _was
및 _before_last_save
문서에 따라 :
_was 문서 출처
def attribute_was(attr)
attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end
문서의 _before_last_save 소스
def attribute_before_last_save(attr_name)
mutations_before_last_save.original_value(attr_name)
end
답변
레일 5.1 이상
추가 _was
는 rails 5.1에서 더 이상 사용되지 않습니다. 이제 다음을 추가해야합니다._before_last_save
다음과 같은 것 :
before_save object
do_something_with object.name_before_last_save
end
데이터베이스에 저장 마지막 전에 이름 값을 반환합니다 (저장 및 생성 작동)
의 차이 사이 _was
및 _before_last_save
문서에 따라 :
_was 문서 출처
def attribute_was(attr)
attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end
문서의 _before_last_save 소스
def attribute_before_last_save(attr_name)
mutations_before_last_save.original_value(attr_name)
end
여기 에서 더 나은 예를 볼 수 있습니다.
답변
ActiveRecord의 attributes_before_type_cast
메서드는 형변환 및 역 직렬화가 발생하기 전에 속성 해시를 반환합니다.
답변
Rails 문서 살펴보기
http://api.rubyonrails.org/classes/ActiveModel/Dirty.html
Model.attribute_was는 이전 값을 반환합니다. : D