I have a model method that I'd like to call from various controllers. It looks something like this:
def Post < ActiveRecord::Base
def read!
self.read_at = Time.now
self.save
self.thread.status = Status.find_by_name("read")
self.thread.save
end
end
In my controller, if I call开发者_StackOverflow @post.read!
, will this rollback on any errors?
In your current setup, if read_at gives an error, it will still continue onto the code that executes thread.status
for example.
You want to use ActiveRecord transactions:
def read!
transaction do
self.read_at = Time.now
self.save
self.thread.status = Status.find_by_name("read")
self.thread.save
end
end
By using transactions, you can be assured that either all your database calls(within the transaction block) will be persisted to the database, or none at all.
精彩评论