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 @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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With