Cách lấy giá trị ban đầu của một thuộc tính trong Rails


96

có cách nào để lấy giá trị gốc mà thuộc tính ActiveRecord (= giá trị đã được tải từ cơ sở dữ liệu) không?

Tôi muốn một cái gì đó như thế này trong một người quan sát

before_save object
  do_something_with object.original_name
end

Nhiệm vụ là xóa đối tượng khỏi bảng băm (thực tế là di chuyển đối tượng đó sang khóa khác trong bảng) sau khi cập nhật.

Câu trả lời:


243

Trước khi rails 5.1

Thêm _wasvào thuộc tính của bạn sẽ cung cấp cho bạn giá trị trước đó.

Đối với đường ray 5.1+

Được sao chép từ câu trả lời của Lucas Andrade bên dưới : https://stackoverflow.com/a/50973808/9359123


Việc bổ sung _waskhông được chấp nhận trong rails 5.1, bây giờ bạn nên nối thêm_before_last_save

Cái gì đó như:

before_save object
  do_something_with object.name_before_last_save
end

Sẽ trả về giá trị tên trước lần lưu cuối cùng của bạn tại cơ sở dữ liệu (hoạt động để lưu và tạo)


Sự khác biệt giữa _was_before_last_savetheo tài liệu:

_là nguồn từ tài liệu

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

_before_last_save nguồn từ tài liệu

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end

7
Ví dụ: cho self.context:self.context_was
Freedom_Ben

2
Tài liệu cho việc này ở đâu?
j sẽ

4
các tài liệu có thể được tìm thấy tại apidock.com/rails/ActiveModel/Dirty/attribute_was
hexinpeter

Trong tài liệu, không có cảnh báo "không dùng nữa" cho _was.
Rael Gugelmin Cunha

11

Đối với đường ray 5.1+

Việc bổ sung _waskhông được chấp nhận trong rails 5.1, bây giờ bạn nên nối thêm_before_last_save

Cái gì đó như:

before_save object
  do_something_with object.name_before_last_save
end

Sẽ trả về giá trị tên trước lần lưu cuối cùng của bạn tại cơ sở dữ liệu (hoạt động để lưu và tạo)


Sự khác biệt giữa _was_before_last_savetheo tài liệu:

_là nguồn từ tài liệu

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

_before_last_save nguồn từ tài liệu

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end

Bạn có thể xem một ví dụ tốt hơn ở đây


1
attribute_wasđã không còn được ủng hộ attribute_in_database, trong khi đó attribute_before_last_savelà một phương thức hoàn toàn mới của 5.1 không có phương thức tương đương trong các phiên bản trước của Rails. Nguồn: github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.