40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/dynamoid/transaction_write/upsert.rb', line 40
def action_request
changes = @attributes.dup
changes = add_timestamps(changes, skip_created_at: true)
changes_dumped = Dynamoid::Dumping.dump_attributes(changes, @model_class.attributes)
partition_key_dumped = dump(@model_class.hash_key, @hash_key)
key = { @model_class.hash_key => partition_key_dumped }
if @model_class.range_key?
sort_key_dumped = dump(@model_class.range_key, @range_key)
key[@model_class.range_key] = sort_key_dumped
end
update_expression_statements = []
expression_attribute_names = {}
expression_attribute_values = {}
changes_dumped.each_with_index do |(name, value), i|
name_placeholder = "#_n#{i}"
value_placeholder = ":_s#{i}"
update_expression_statements << "#{name_placeholder} = #{value_placeholder}"
expression_attribute_names[name_placeholder] = name
expression_attribute_values[value_placeholder] = value
end
update_expression = "SET #{update_expression_statements.join(', ')}"
{
update: {
key: key,
table_name: @model_class.table_name,
update_expression: update_expression,
expression_attribute_names: expression_attribute_names,
expression_attribute_values: expression_attribute_values
}
}
end
|