Rails에서 속성의 원래 값을 얻는 방법


96

ActiveRecord 속성 (= 데이터베이스에서로드 된 값)의 원래 값을 가져 오는 방법이 있습니까?

나는 관찰자에게 이런 것을 원한다

before_save object
  do_something_with object.original_name
end

작업은 업데이트시 해시 테이블에서 개체를 제거하는 것입니다 (실제로 테이블의 다른 키로 이동).

답변:


243

레일 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

7
예 : for self.context:self.context_was
Freedom_Ben 2014

2
이에 대한 문서는 어디에 있습니까?
j는


문서에는에 대한 "지원 중단"경고가 없습니다 _was.
Rael Gugelmin Cunha

11

레일 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

여기 에서 더 나은 예를 볼 수 있습니다.


1
attribute_was는을 (를) 위해 사용되지 않는 attribute_in_database반면, attribute_before_last_save이전 버전의 Rails에는 해당되지 않는 5.1의 완전히 새로운 메서드입니다. 출처 : github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.