วิธีรับค่าเดิมของแอตทริบิวต์ใน 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ไม่ได้รับการสนับสนุนในราง 5.1 ตอนนี้คุณควรต่อท้าย_before_last_save

สิ่งที่ต้องการ:

before_save object
  do_something_with object.name_before_last_save
end

จะคืนค่าชื่อก่อนบันทึกครั้งสุดท้ายที่ฐานข้อมูล (ใช้สำหรับบันทึกและสร้าง)


ความแตกต่างระหว่าง_wasและ_before_last_saveตามเอกสาร:

_ เป็นแหล่งที่มาจากเอกสาร

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

2
เอกสารนี้อยู่ที่ไหน
จะ

4
สามารถดูเอกสารประกอบได้ที่apidock.com/rails/ActiveModel/Dirty/attribute_was
hexinpeter

ในเอกสารนี้ไม่มี "เลิก" _wasเตือน
Rael Gugelmin Cunha

11

สำหรับราง 5.1+

การต่อท้าย_wasไม่ได้รับการสนับสนุนในราง 5.1 ตอนนี้คุณควรต่อท้าย_before_last_save

สิ่งที่ต้องการ:

before_save object
  do_something_with object.name_before_last_save
end

จะคืนค่าชื่อก่อนบันทึกครั้งสุดท้ายที่ฐานข้อมูล (ใช้สำหรับบันทึกและสร้าง)


ความแตกต่างระหว่าง_wasและ_before_last_saveตามเอกสาร:

_ เป็นแหล่งที่มาจากเอกสาร

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เป็นวิธีการใหม่ทั้งหมดในเวอร์ชัน 5.1 ที่ไม่มีทางเทียบเท่ากับ Rails เวอร์ชันก่อนหน้า ที่มา: github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.