class ReeDao::Associations

def association(assoc_type, assoc_name, __opts, &block)

def association(assoc_type, assoc_name, __opts, &block)
  if parent_dao.nil? || parent_dao.db.in_transaction? || self.class.sync_mode?
    return if association_is_not_included?(assoc_name) || list.empty?
    association = Association.new(self, parent_dao, list, **global_opts)
    if assoc_type == :field
      association.handle_field(__opts)
    else
      association.load(assoc_type, assoc_name, **get_assoc_opts(__opts), &block)
    end
  else
    if association_is_not_included?(assoc_name) || list.empty?
      return { association_threads: @assoc_threads, field_threads: @field_threads }
    end
    association = Association.new(self, parent_dao, list, **global_opts)
    if assoc_type == :field
      field_proc = __opts
      {
        association_threads: @assoc_threads,
        field_threads: @field_threads << [
          association, field_proc
        ]
      }
    else
      {
        association_threads: @assoc_threads << [
          association, assoc_type, assoc_name, get_assoc_opts(__opts), block
        ],
        field_threads: @field_threads
      }
    end
  end
end