Sha256: 36fe5429cf365f1817a1b7cbe8c4442012ec74aa4f570f6b64b1d67c64dee838

Contents?: true

Size: 1.13 KB

Versions: 9

Compression:

Stored size: 1.13 KB

Contents

class ReeDao::OneToMany
  include Ree::FnDSL

  fn :one_to_many do
    link :demodulize, from: :ree_string
    link :group_by, from: :ree_array
    link :underscore, from: :ree_string
  end

  contract(
    ArrayOf[ -> (v) { v.class.ancestors.include?(ReeDto::EntityDSL) || v.class.ancestors.include?(ReeDto::DSL) } ],
    Sequel::Dataset,
    Ksplat[
      foreign_key?: Symbol,
      assoc_setter?: Symbol
    ] => nil
  )
  def call(list, assoc_dao, **opts)
    return if list.empty?
    root_ids = list.map(&:id)

    assoc_setter = if opts.key?(:assoc_setter)
      opts[:assoc_setter]
    else
      dto_class = assoc_dao
        .opts[:schema_mapper]
        .dto(:db_load)

      name = underscore(demodulize(dto_class.name))
      "set_#{name}s".to_sym
    end

    foreign_key = if opts.key?(:foreign_key)
      opts[:foreign_key]
    else
      name = underscore(demodulize(list.first.class.name))
      "#{name}_id".to_sym
    end

    assoc_by_group = group_by(assoc_dao.where(foreign_key => root_ids).all) { _1.send(foreign_key) }

    list.each do |item|
      item.send(assoc_setter, assoc_by_group[item.id] || [])
    end

    nil
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
ree_lib-1.1.1 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.1.0 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.124 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.123 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.122 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.121 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.120 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.119 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.118 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb