This plugin allows you to add filters on a per object basis that restrict updating or deleting the object. It’s designed for cases where you would normally have to drop down to the dataset level to get the necessary control, because you only want to delete or update the rows in certain cases based on the current status of the row in the database. The main purpose of this plugin is to avoid race conditions by relying on the atomic properties of database transactions.
class Item < Sequel::Model plugin :instance_filters end # These are two separate objects that represent the same # database row. i1 = Item.first(id: 1, delete_allowed: false) i2 = Item.first(id: 1, delete_allowed: false) # Add an instance filter to the object. This filter is in effect # until the object is successfully updated or deleted. i1.instance_filter(delete_allowed: true) # Attempting to delete the object where the filter doesn't # match any rows raises an error. i1.delete # raises Sequel::NoExistingObject # The other object that represents the same row has no # instance filters, and can be updated normally. i2.update(delete_allowed: true) # Even though the filter is now still in effect, since the # database row has been updated to allow deleting, # delete now works. i1.delete
This plugin sets the require_modification flag on the model, so if the model’s dataset doesn’t provide an accurate number of matched rows, this could result in invalid exceptions being raised.
Classes and Modules
Exception class raised when updating or deleting an object does not affect exactly one row.
Public Class methods
Set the require_modification flag to true for the model.
# File lib/sequel/plugins/instance_filters.rb 49 def self.configure(model) 50 model.require_modification = true 51 end