module Sequel::Model::Associations::ClassMethods

Each kind of association adds a number of instance methods to the model class which are specialized according to the association type and optional parameters given in the definition. Example:

class Project < Sequel::Model
  many_to_one :portfolio
  # or: one_to_one :portfolio
  one_to_many :milestones
  # or: many_to_many :milestones
end

The project class now has the following instance methods:

portfolio

Returns the associated portfolio.

portfolio=(obj)

Sets the associated portfolio to the object, but the change is not persisted until you save the record (for many_to_one associations).

portfolio_dataset

Returns a dataset that would return the associated portfolio, only useful in fairly specific circumstances.

milestones

Returns an array of associated milestones

add_milestone(obj)

Associates the passed milestone with this object.

remove_milestone(obj)

Removes the association with the passed milestone.

remove_all_milestones

Removes associations with all associated milestones.

milestones_dataset

Returns a dataset that would return the associated milestones, allowing for further filtering/limiting/etc.

If you want to override the behavior of the add_/remove_/remove_all_/ methods or the association setter method, use the :adder, :remover, :clearer, and/or :setter options. These options override the default behavior.

By default the classes for the associations are inferred from the association name, so for example the Project#portfolio will return an instance of Portfolio, and Project#milestones will return an array of Milestone instances. You can use the :class option to change which class is used.

Association definitions are also reflected by the class, e.g.:

Project.associations
=> [:portfolio, :milestones]
Project.association_reflection(:portfolio)
=> #<Sequel::Model::Associations::ManyToOneAssociationReflection Project.many_to_one :portfolio>

Associations should not have the same names as any of the columns in the model’s current table they reference. If you are dealing with an existing schema that has a column named status, you can’t name the association status, you’d have to name it foo_status or something else. If you give an association the same name as a column, you will probably end up with an association that doesn’t work, or a SystemStackError.

For a more in depth general overview, as well as a reference guide, see the Association Basics guide. For examples of advanced usage, see the Advanced Associations guide.