Module: Sequel::Plugins::InstanceSpecificDefault
- Defined in:
- lib/sequel/plugins/instance_specific_default.rb
Overview
The instance_specific_default plugin exists to make it easier to use a global :instance_specific association option, or to warn or raise when Sequel has to guess which value to use :instance_specific option (Sequel defaults to guessing true as that is the conservative setting). It is helpful to use this plugin, particularly with the :warn or :raise settings, to determine which associations should have :instance_specific set. Setting the :instance_specific to false for associations that are not instance specific can improve performance.
Associations are instance-specific if their block calls a model instance method, or where the value of the block varies based on runtime state, and the variance is outside of a delayed evaluation. For example, with the following three associations:
Album.one_to_one :first_track, class: :Track do |ds|
  ds.where(number: 1)
end
Album.one_to_one :last_track, class: :Track do |ds|
  ds.where(number: num_tracks)
end
Album.one_to_many :recent_tracks, class: :Track do |ds|
  ds.where{date_updated > Date.today - 10}
end
first_track is not instance specific, but last_track and recent_tracks are. last_track is because the num_tracks call in the block is calling Album#num_tracks.  recent_tracks is because the value will change over time. This plugin allows you to find these cases, and set the :instance_specific option appropriately for them:
Album.one_to_one :first_track, class: :Track, instance_specific: false do |ds|
  ds.where(number: 1)
end
Album.one_to_one :last_track, class: :Track, instance_specific: true do |ds|
  ds.where(number: num_tracks)
end
Album.one_to_many :recent_tracks, class: :Track, instance_specific: true do |ds|
  ds.where{date_updated > Date.today - 10}
end
For the recent_tracks association, instead of marking it instance_specific, you could also use a delayed evaluation, since it doesn’t actually contain instance-specific code:
Album.one_to_many :recent_tracks, class: :Track, instance_specific: false do |ds|
  ds.where{date_updated > Sequel.delay{Date.today - 10}}
end
Possible arguments to provide when loading the plugin:
- true
- 
Set the :instance_specific option to true 
- false
- 
Set the :instance_specific option to false 
- :default
- 
Call super to set the :instance_specific option 
- :warn
- 
Emit a warning before calling super to set the :instance_specific option 
- :raise
- 
Raise a Sequel::Error if an :instance_specific option is not provided and an association could be instance-specific. 
Note that this plugin only affects associations which could be instance specific (those with blocks), where the :instance_specific option was not specified when the association was created.
Usage:
# Set how to handle associations that could be instance specific
# but did not specify an :instance_specific option, for all subclasses
# (set before creating subclasses).
Sequel::Model.plugin :instance_specific_default, :warn
# Set how to handle associations that could be instance specific
# but did not specify an :instance_specific option, for the Album class
Album.plugin :instance_specific_default, :warn
Defined Under Namespace
Modules: ClassMethods
Class Method Summary collapse
- 
  
    
      .configure(model, default)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Set how to handle associations that could be instance specific but did not specify an :instance_specific value. 
Class Method Details
.configure(model, default) ⇒ Object
Set how to handle associations that could be instance specific but did not specify an :instance_specific value.
| 83 84 85 | # File 'lib/sequel/plugins/instance_specific_default.rb', line 83 def self.configure(model, default) model.instance_variable_set(:@instance_specific_default, default) end |