2016-02-05 32 views
-1

所以我試圖在屬性上使用_was方法。 可以說我有一個對象Person在rails中使用_was方法

Person.name = "new name" 

Person.name_was = "old name" 

如果我是叫Person.changed?它會返回["name"]

所以我的問題是:我可以以某種方式使用該值從person.changed做這樣的事情:

Person.changed.each do |x| 
    Person.x => returns undefined value for x 
    Person['x'] => returns new name 
    Person["#{'x'}_was"] => errors 
end 

有沒有一種方法,我可以使用_was方法與x字符串變量?

回答

0

我不太確定示例代碼試圖實現什麼,但我認爲您正在尋找#changes方法;

person = Person.create(first_name: 'John', last_name: 'Doe', sex: 'Male') 
person.first_name = 'Jane' 
person.sex = 'Female' 
person.changes.each do |attribute, change| 
    puts attribute 
    puts change.first 
    puts change.last 
end 

# => 'first_name' 
# => 'John' 
# => 'Jane' 
# => 'sex' 
# => 'Male' 
# => 'Female' 

person.changes返回一個散列,其中包含所有的變化; {attribute_name => [before,after]}

0

如果您有變量中屬性的名稱,則可以使用send。另外,Person可能是一個類,我想你寧願使用一個實例。試用:

person = Person.first 

# stuff happens... 

person.changed.each do |x| 
    person.public_send(x) 
    person.public_send("#{x}_was") 
end 

或者不要重新發明輪子,只使用person.changes。看看ActiveModel::Dirty module

0

您可以使用「public_send」或「方法」的方法

person = Person.first 

person.name # => 'Jhon Doe' 
person.gender # => 'M' 
person.birthdate # => Wed, 05 Sep 1984 

person.name = 'Jane Doe' 
person.gender = 'F' 

person.changed.each do |attr| 
    p person.public_send(attr) # => person.name => 'Jane Doe' 
    p person.method(attr).call  # => person.name => 'Jane Doe' 
    p person.public_send("#{attr}_was") # => person.name_was => 'Jhon Doe' 
    p person.method("#{attr}_was").call  # => person.name_was => 'Jhon Doe' 
end 

_was屬性是getter和不具有setter方法。

+0

這不會工作:'person.method(attr)',因爲它只會返回一個代表方法的對象。爲了實際_invoke_方法,你需要發送'call'消息:'p person.method(attr).call'。 – tompave

+0

正確,謝謝 – jonathanccalixto

相關問題