Sha256: 8c5727b1db0e77abea5379876398685374986b225c49d27220a42e07584f3d8f

Contents?: true

Size: 1.09 KB

Versions: 87

Compression:

Stored size: 1.09 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) } ],
    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

87 entries across 87 versions & 1 rubygems

Version Path
ree_lib-1.0.117 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.116 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.115 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.114 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.113 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.112 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.111 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.110 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.109 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.108 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.107 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.106 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.105 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.104 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.103 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.102 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.101 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.100 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.99 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
ree_lib-1.0.98 lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb