天天看點

【Ruby on Rails】Model中關于儲存之前的原值和修改狀态

今天在Rails的Model中遇到了一個問題——

當我從Model類中擷取了一個ActiveRecord對象,對其進行了一系列修改(尚未儲存),我該如何确定究竟哪些修改了呢?

(設Model為Option,相關的的參數為correct)

我本來采取的方法是——在資料表中新增一個ori_correct參數,每次對象儲存之前都和correct做到同步,這樣一來,是不是correct字段發生了修改也就得以判斷了。

但是這樣的缺點也顯而易見——如果以後參數個數很多的話,豈不是得每一個都得來一個相應的ori_字段?這樣的話每個都要雙份的建立字段,想象也覺得并不合理,總感覺Rails應該對這類問題有一個較好的解決方案。事實上的确如此,我在StackOverFlow上看到了這樣的一個用法 :

Check out ActiveModel::Dirty (available on all models by default). The documentation is really good, but it lets you do things such as:
1 @user.street1_changed? # => true/false      

也就是在相應字段後面添加_changed?,這樣一來問題直接解決,親測有效。

然而很快另外一個問題又來了,既然知道了是否被改變,那該如何知道原來的值是什麼呢?

同樣的,我在StackOverFlow上找到了解決辦法

Appending

_was

to your attribute will give you the previous value.

同樣的,親測有效。

以上,兩個問題完美解決。

(關于更多的關于ActiveModel::Dirty所支援的各種神奇功能,請在http://api.rubyonrails.org/中輸入ActiveModel::Dirty)