hyperstack-org/hyperstack

add `create` method HyperModel collection class

Open

#134 aperta il 8 mar 2019

Vedi su GitHub
 (0 commenti) (0 reazioni) (1 assegnatario)JavaScript (43 fork)batch import
enhancementgood first issue

Metriche repository

Star
 (531 star)
Metriche merge PR
 (Nessuna PR mergiata in 30 g)

Descrizione

i.e.

something.groups.create(name: 'new group')
# roughly the same as 
new_group << Group.new(name: 'new group')
something.groups << new_group
new_group.save

Note that Hyperstack currently does not save an item when its pushed onto a collection, unless the collection is a has_many :through relationship, hence the final save above.

Like the AR create method this should return a promise / take a block that is resolved when the save completes.

Roughly code:

    def create(args = {})
      args = [args] unless args.is_a? Array
      items_to_save =
        if (through_association = @association&.through_association)
          args.collect do |attributes|
            through_association.klass.new(
              @association.inverse_of => @owner,
              @association.source => @association.klass.new(attributes)
            )
          end
        else
          args.collect do |attributes|
            @association.klass.new(attributes).tap { |item| _internal_push(item) }
          end
        end
      Promise.new.tap do |promise|
        Promise.when(items_to_save.collect(&:save)).then do
          promise.resolve(items_to_save)
          yield *items_to_save if block_given?
        end
      end
    end

Guida contributor