class ReeDao::Association

def one_to_one(parent_dao, assoc_name, list, scope: nil, primary_key: :id, foreign_key: nil, setter: nil, to_dto: nil, reverse: true)

def one_to_one(parent_dao, assoc_name, list, scope: nil, primary_key: :id, foreign_key: nil, setter: nil, to_dto: nil, reverse: true)
  return {} if list.empty?
  primary_key ||= :id
  if scope.is_a?(Array)
    items = scope
  else
    assoc_dao = find_dao(assoc_name, parent, scope)
    if reverse
      # has_one
      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(&:id).uniq
    else
      # belongs_to
      if !foreign_key
        foreign_key = :"#{assoc_name}_id"
      end
      root_ids = list.map(&:"#{foreign_key}").compact
    end
    scope ||= assoc_dao
    scope = scope.where((reverse ? foreign_key : :id) => root_ids)
    items = add_scopes(scope, global_opts[assoc_name])
  end
  assoc = index_by(items) { _1.send(reverse ? foreign_key : :id) }
  populate_association(
    list,
    assoc,
    assoc_name,
    setter: setter,
    reverse: reverse,
    primary_key: primary_key,
    foreign_key: foreign_key,
    to_dto: to_dto
  )
  assoc
end