module Sequel::Plugins::Upsert::ClassMethods

Public Instance Methods

multi_upsert(rows, **options) click to toggle source

Executes the upsert request for multiple rows @see upsert @see upsert_dataset

# 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) click to toggle source

Returns formatted row values

@param row [Hash]

@return [Hash]

# File lib/sequel/plugins/upsert.rb, line 50
def sequel_values(row)
  upsert_model.new(row).values
end
upsert(row, **options) click to toggle source

Executes the upsert request

@param row [Hash] values @param options [Hash] options

@example

User.upsert(name: "John", email: "jd@test.com", target: :email)

@return [Sequel::Model]

# 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) click to toggle source

Returns an upsert dataset

@param target [Symbol] target column @example

User.upsert_dataset.insert(name: "John", email: "jd@test.com")

@return [Sequel::Dataset] dataset

# 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_model() click to toggle source

Returns upsert model for current table

@return [Sequel::Model]

# File lib/sequel/plugins/upsert.rb, line 57
def upsert_model
  @upsert_model ||= Sequel::Model(table_name)
end