Rails: How do I call `self.save` in my model and have it persist in the database?
I'm trying to keep model logic within my model, but I can't get it to perform modifications on itself and have them persist in the database.
In my controller:
@article.perform_some_calulcations!
In my model:
def perform_some_calculations!
self.foo.gsub!(/regexp/, 开发者_C百科'string')
self.save
end
If I drop debugger
statements into my method and after my call to it in the controller, @article.foo
has the correct value. However, when I continue, it doesn't persist in the database and webrick doesn't report any UPDATE
statements.
What's going wrong? I don't know if I've ever had to do this before, but surely it's possible right?
Your problem was that if you modify an attribute "in place", this means: without assigning it a new value, then Rails will think that there is nothing new to be saved, so it "optimizes" the save away.
Each write accessor of your attribute will set a flag, so the save method will know that it should check whether the current value really differs from the value read from the database.
That's why self.foo = self.foo.gsub(/regexp/, 'string')
works (note that the exclamation mark is not necessary here).
If you need to modify an attribute "in place", for example with gsub!
or replace
, use:
def perform_some_calculations!
foo_will_change!
self.foo.gsub!(/regexp/, 'string')
self.save
end
Your attributes might be protected. Check your log. IF that is the case then
self.save!
or
self.save(false)
try taking the exclamation point off your definition.
self.foo = self.foo.gsub!(/regexp/, 'string')
I was trying to create a method in a class to modify itself base on an argument. Using .save
or .save!
did not work for me, but if I used
self.update!({<PROP_NAME>: <NEW_VALUE>})
I saw the changes persisted in my database.
精彩评论