module Sequel::Plugins::NestedAttributes::ClassMethods

Public Instance Methods

freeze() click to toggle source

Freeze nested_attributes_module when freezing model class.

Calls superclass method
    # File lib/sequel/plugins/nested_attributes.rb
 96 def freeze
 97   @nested_attributes_module.freeze if @nested_attributes_module
 98 
 99   super
100 end
nested_attributes(*associations, &block) click to toggle source

Allow nested attributes to be set for the given associations. Options:

:destroy

Allow destruction of nested records.

:fields

If provided, should be an Array or proc. If it is an array, restricts the fields allowed to be modified through the association_attributes= method to the specific fields given. If it is a proc, it will be called with the associated object and should return an array of the allowable fields.

:limit

For *_to_many associations, a limit on the number of records that will be processed, to prevent denial of service attacks.

:reject_if

A proc that is called with each attribute hash before it is passed to its associated object. If the proc returns a truthy value, the attribute hash is ignored.

:reject_nil

Ignore nil objects passed to nested attributes setter methods.

:remove

Allow disassociation of nested records (can remove the associated object from the parent object, but not destroy the associated object).

:require_modification

Whether to require modification of nested objects when updating or deleting them (checking that a single row was updated). By default, uses the default require_modification setting for the nested object.

:transform

A proc to transform attribute hashes before they are passed to associated object. Takes two arguments, the parent object and the attribute hash. Uses the return value as the new attribute hash.

:unmatched_pk

Specify the action to be taken if a primary key is provided in a record, but it doesn’t match an existing associated object. Set to :create to create a new object with that primary key, :ignore to ignore the record, or :raise to raise an error. The default is :raise.

If a block is provided, it is used to set the :reject_if option.

    # File lib/sequel/plugins/nested_attributes.rb
131 def nested_attributes(*associations, &block)
132   include(@nested_attributes_module ||= Module.new) unless @nested_attributes_module
133   opts = associations.last.is_a?(Hash) ? associations.pop : OPTS
134   reflections = associations.map{|a| association_reflection(a) || raise(Error, "no association named #{a} for #{self}")}
135   reflections.each do |r|
136     r[:nested_attributes] = opts.dup
137     r[:nested_attributes][:unmatched_pk] ||= :raise
138     r[:nested_attributes][:reject_if] ||= block
139     def_nested_attribute_method(r)
140   end
141 end

Private Instance Methods

def_nested_attribute_method(reflection) click to toggle source

Add a nested attribute setter method to a module included in the class.

    # File lib/sequel/plugins/nested_attributes.rb
147 def def_nested_attribute_method(reflection)
148   @nested_attributes_module.class_eval do
149     meth = :"#{reflection[:name]}_attributes="
150     assoc = reflection[:name]
151     define_method(meth) do |v|
152       set_nested_attributes(assoc, v)
153     end
154     alias_method meth, meth
155   end
156 end