DatasetAssociations
allows you to easily use your model associations via datasets. For each association you define, it creates a dataset method for that association that returns a dataset of all objects that are associated to objects in the current dataset. Here’s a simple example:
class Artist < Sequel::Model plugin :dataset_associations one_to_many :albums end Artist.where(id: 1..100).albums # SELECT * FROM albums # WHERE (albums.artist_id IN ( # SELECT id FROM artists # WHERE ((id >= 1) AND (id <= 100))))
This works for all of the association types that ship with Sequel
, including ones implemented in other plugins. Most association options that are supported when eager loading are supported when using a dataset association. However, it will only work for limited associations or *_one associations with orders if the database supports window functions.
As the dataset methods return datasets, you can easily chain the methods to get associated datasets of associated datasets:
Artist.where(id: 1..100).albums.where{name < 'M'}.tags # SELECT tags.* FROM tags # WHERE (tags.id IN ( # SELECT albums_tags.tag_id FROM albums # INNER JOIN albums_tags # ON (albums_tags.album_id = albums.id) # WHERE # ((albums.artist_id IN ( # SELECT id FROM artists # WHERE ((id >= 1) AND (id <= 100))) # AND # (name < 'M')))))
For associations that do JOINs, such as many_to_many, note that the datasets returned by a dataset association method do not do a JOIN by default (they use a subquery that JOINs). This can cause problems when you are doing a select, order, or filter on a column in the joined table. In that case, you should use the :dataset_associations_join
option in the association, which will make sure the datasets returned by the dataset association methods also use JOINs, allowing such dataset association methods to work correctly.
Usage:
# Make all model subclasses create association methods for datasets Sequel::Model.plugin :dataset_associations # Make the Album class create association methods for datasets Album.plugin :dataset_associations