class ReeDao::Association

def one_to_many(parent_dao, assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil, to_dto: nil)

def one_to_many(parent_dao, assoc_name, list, primary_key: nil, foreign_key: nil, scope: nil, setter: nil, to_dto: nil)
  return {} if list.empty?
  primary_key ||= :id
  if scope.is_a?(Array)
    items = scope
  else
    assoc_dao = nil
    assoc_dao = find_dao(assoc_name, parent, scope)
    if !foreign_key
      if parent_dao.nil?
        raise ArgumentError.new("foreign_key should be provided for :#{assoc_name} association")
      end
      foreign_key = foreign_key_from_dao(parent_dao)
    end
    root_ids = list.map(&:"#{primary_key}")
    scope ||= assoc_dao
    scope = scope.where(foreign_key => root_ids)
    items = add_scopes(scope, global_opts[assoc_name])
  end
  assoc = if foreign_key
    group_by(items) { _1.send(foreign_key) }
  else
    items
  end
  populate_association(
    list,
    assoc,
    assoc_name,
    setter: setter,
    primary_key: primary_key,
    foreign_key: foreign_key,
    to_dto: to_dto,
    multiple: true
  )
  assoc
end