Module: Sequel::Plugins::Upsert::ClassMethods

Defined in:
lib/sequel/plugins/upsert.rb

Instance Method Summary collapse

Instance Method Details

#multi_upsert(rows, **options) ⇒ Object

Executes the upsert request for multiple rows



39
40
41
42
# File 'lib/sequel/plugins/upsert.rb', line 39

def multi_upsert(rows, **options)
  rows = rows.map { |row| sequel_values(row) }
  upsert_dataset(options).multi_insert(rows)
end

#sequel_values(row) ⇒ Hash

Returns formatted row values

Parameters:

  • row (Hash)

Returns:

  • (Hash)


49
50
51
# File 'lib/sequel/plugins/upsert.rb', line 49

def sequel_values(row)
  upsert_model.new(row).values
end

#upsert(row, **options) ⇒ Sequel::Model

Executes the upsert request

Examples:

User.upsert(name: "John", email: "[email protected]", target: :email)

Parameters:

  • row (Hash) —

    values

  • options (Hash) —

    options

Returns:

  • (Sequel::Model)


32
33
34
# File 'lib/sequel/plugins/upsert.rb', line 32

def upsert(row, **options)
  upsert_dataset(**options).insert(sequel_values(row))
end

#upsert_dataset(target: primary_key) ⇒ Sequel::Dataset

Returns an upsert dataset

Examples:

User.upsert_dataset.insert(name: "John", email: "[email protected]")

Parameters:

  • target (Symbol) (defaults to: primary_key) —

    target column

Returns:

  • (Sequel::Dataset) —

    dataset



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/sequel/plugins/upsert.rb', line 12

def upsert_dataset(target: primary_key)
  cols = columns - Array(primary_key)
  update_spec = cols.map { |x| [x, Sequel[:excluded][x]] }
  where_spec = cols.map { |x| [Sequel[table_name][x], Sequel[:excluded][x]] }

  dataset.insert_conflict(
    target: target,
    update: update_spec,
    update_where: Sequel.~(where_spec),
  )
end

#upsert_model ⇒ Sequel::Model

Returns upsert model for current table

Returns:

  • (Sequel::Model)


56
57
58
# File 'lib/sequel/plugins/upsert.rb', line 56

def upsert_model
  @upsert_model ||= Sequel::Model(table_name)
end