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



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

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)


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

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)


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

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
23
# 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::Plugins::Upsert.distinct_expr(table_name, x) }.reduce(:|)

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

#upsert_modelSequel::Model

Returns upsert model for current table

Returns:

  • (Sequel::Model)


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

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