New Features¶ ↑
-
Model.freeze is now supported and recommended in production and during testing. It freezes all class-level metadata, preventing possible thread-safety issues at runtime.
-
Model.finalize_associations has been added, speeding up some association reflection methods by about 10x. This method should be called after all associated models have been loaded. This can speed up the retrieval of associated objects for small datasets by 5-10%.
One advantage of using this is it will raise an exception if it recognizes that any of your associations are not defined correctly, such as referencing an associated class that doesn’t exist.
-
Model.freeze_descendents has been added to the subclasses plugin. This method finalizes associations for all descendent classes, then freezes the descendent class. It’s designed to make it easy to freeze all model classes in use:
Sequel::Model.plugin :subclasses Dir['./models/*.rb'].each{|f| require f} Sequel::Model.freeze_descendents
-
An implicit_subquery dataset extension has been added, which implicitly uses a subquery if you have a dataset with raw SQL and you call a method that would modify the SQL used:
DB['SELECT * FROM foo'].where(:bar=>1) # SELECT * FROM foo DB.extension :implicit_subquery DB['SELECT * FROM foo'].where(:bar=>1) # SELECT * FROM (SELECT * FROM foo) AS t1 WHERE (bar = 1)
-
Model datasets now have where_all, where_each, and where_single_value methods for returning data:
class Album < Sequel::Model; end Album.where_all(:id=>[1,2,3]) # => [Album[1], Album[3], Album[2]] Album.where_each(:id=>[1,2,3]) do |album| # ... end Album.select(:name).where_single_value(:id=>1) # "Album's Name"
These methods are designed for use by other dataset methods you define, and are optimized for frozen datasets if the methods will be called multiple times on the same dataset. where_all and where_each can increase performance by up to 40% for small datasets compared to where.all and where.each. where_single_value can be up to twice as fast as where.single_value.
-
Model.dataset_module now supports an eager method for eager loading:
class Album < Sequel::Model many_to_one :artist dataset_module do eager :with_artist, :artist end end Album.with_artist.all # eagerly loads artist association
Other Improvements¶ ↑
-
The jdbc adapter now supports Database#freeze. Possible thread-safety issues when initializing multiple jdbc Database instances in separate threads at the same time have been fixed.
-
The postgres adapter now raises an exception if it recognizes that the loaded version of sequel_pg is incompatible.
-
Sequel
classes that are subclasses of core classes now define custom inspect methods so instances can easily be differentiated from core class instances. For example:Sequel::SQL::Blob.new('a') # => #<Sequel::SQL::Blob:0xa6f3a3c3710 bytes=1 content="a"> Sequel::SQLTime.now # => #<Sequel::SQLTime 10:03:06> Sequel::LiteralString.new("foo") # => #<Sequel::LiteralString "foo"> class Album < Sequel::Model; end Album.many_to_one :artist # => #<Sequel::Model::Associations::ManyToOneAssociationReflection Album.many_to_one :artist> Sequel::SQL::ValueList.new([[1,2]]) # => #<Sequel::SQL::ValueList [[1, 2]]>
-
Dataset#from_self now copies the columns from the current dataset if they are present, since wrapping a dataset in a subquery should not change the columns returned.
-
On PostgreSQL, array type conversion now correctly handles false values.
-
Another disconnect error is now recognized by the jdbc/as400 adapter.
-
Modifications to Sequel::Model::Associations::ASSOCIATION_TYPES are now thread safe, fixing issues if separate threads attempt to load separate model plugins that modify this hash.
-
The force_encoding plugin no longer modifies the encoding of
Sequel::SQL::Blob
instances. -
Many plugins were updated so they no longer add constants to the namespace of the model that loads them.
Backwards Compatibility¶ ↑
-
Maintainers of external model plugins should update their code to support Model.freeze.