2013-09-06 48 views
10

Có cách nào để hoàn tác/hoàn nguyên bất kỳ thay đổi cục bộ nào đối với đối tượng Activerecord hay không. Ví dụ:Làm cách nào để hoàn nguyên/hoàn tác các thay đổi cục bộ đối với đối tượng Activerecord?

user = User.first 
user.name # "Fred" 
user.name = "Sam" 
user.name_was # "Fred" 

user.revert 
user.name # "Fred" 

Tôi biết tôi có thể làm user.reload nhưng tôi không cần phải nhấn cơ sở dữ liệu để làm điều này kể từ khi các giá trị cũ được lưu trữ trong tình trạng của đối tượng.

Tốt hơn là giải pháp Rails 3.

+0

lý do tại sao bạn cần điều này? – CodeGroover

+0

Tôi đoán bạn có thể gán 'nil' cho người dùng, ví dụ: 'user = nil' tương đương với revert (nhưng không nhất thiết là giá trị cũ) – Bala

+0

Tôi không nhận ra rằng các giá trị cũ đã được giữ lại trong đối tượng. Bạn có thể chỉ cho tôi bất kỳ tài liệu nào về cách truy cập chúng không? –

Trả lời

7

Bạn chỉ có thể lặp qua 'thay đổi' và đặt lại chúng. Có thể có một phương pháp thực hiện điều này, nhưng tôi không nhìn.

> c = Course.first 
> c.name 
=> "Athabasca Country Club" 
> c.name = "Foo Bar" 
=> "Foo Bar" 
> c.changes 
=> {"name"=>["Athabasca Country Club", "Foo Bar"]} 
> c.changes.each {|k,vs| c[k] = vs.first} 
> c.name 
=> "Athabasca Country Club" 

Thực ra có vẻ như có một "name_reset!" phương pháp bạn có thể gọi ...

> c.changes.each {|k,vs| c.send("#{k}_reset!")} 
+0

Id thay vì sử dụng 'c.changes.each {| k, vs | c.send ("# {k} =", vs.first)} 'thay vì ký hiệu băm để đặt thuộc tính cho đối tượng. – MrYoshiji

-4

Đây là một phương pháp để thiết lập lại các thuộc tính từ cơ sở dữ liệu:

user.reload 
+1

OP cho biết anh ta biết về điều này đã và không muốn nhấn DB. – mgwidmann

9

Như đã đề cập trong this answer Rails 4.2 giới thiệu các phương pháp restore_attributes trong ActiveModel::Dirty:

user = User.first 
user.name # "Fred" 
user.status # "Active" 

user.name = "Sam" 
user.status = "Inactive" 
user.restore_attributes 
user.name # "Fred" 
user.status # "Active" 

Nếu bạn muốn khôi phục một thuộc tính cụ thể, restore_attribute! thể được sử dụng:

user.name = "Sam" 
user.status = "Inactive" 
user.restore_name! 
user.name # "Fred" 
user.status # "Inactive"