Module: AtomicArrays

Defined in:
lib/atomic_arrays.rb,
lib/atomic_arrays/version.rb

Defined Under Namespace

Modules: AtomicClassMethods

Constant Summary collapse

VERSION =
"1.1.0"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



5
6
7
8
9
# File 'lib/atomic_arrays.rb', line 5

def self.included(klass)
    klass.class_eval do
      extend AtomicClassMethods
    end
end

Instance Method Details

#atomic_append(field, value) ⇒ Object



11
12
13
14
15
# File 'lib/atomic_arrays.rb', line 11

def atomic_append(field, value)
    raise "Cannot append multiple values." if value.is_a?(Array)
    value = prepare_array_vals(value)
    return self.execute_array_query(field, value, "array_append")
end

#atomic_cat(field, values) ⇒ Object



23
24
25
26
27
# File 'lib/atomic_arrays.rb', line 23

def atomic_cat(field, values)
    raise "Cannot cat strings or integers" if (values.is_a?(Integer) || values.is_a?(String))
    values = prepare_array_vals(values)
    return self.execute_array_query(field, "ARRAY[#{values}]", "array_cat")
end

#atomic_relate(field, related_class, limit = 100) ⇒ Object



29
30
31
32
33
34
# File 'lib/atomic_arrays.rb', line 29

def atomic_relate(field, related_class, limit=100)
    raise "Relates to a class, not a string or integer." if (related_class.is_a?(Integer) || related_class.is_a?(String))
    (table, field) = self.prepare_array_query(field)
    related_table = related_class.table_name.inspect
    return result = related_class.execute_and_wrap(%Q{SELECT #{related_table}.* FROM #{related_table} JOIN (SELECT unnest(#{table}.#{field}) AS id FROM #{table} WHERE #{table}.id = #{self.id}) u USING (id) LIMIT #{limit}})
end

#atomic_remove(field, value) ⇒ Object



17
18
19
20
21
# File 'lib/atomic_arrays.rb', line 17

def atomic_remove(field, value)
    raise "Cannot remove multiple values." if value.is_a?(Array)
    value = prepare_array_vals(value)
    return self.execute_array_query(field, value, "array_remove")
end

#execute_array_query(field, value, array_method) ⇒ Object



36
37
38
39
40
# File 'lib/atomic_arrays.rb', line 36

def execute_array_query(field, value, array_method)
    (table, field) = self.prepare_array_query(field)
    result = self.class.execute_and_wrap(%Q{UPDATE #{table} SET #{field} = #{array_method}(#{field}, #{value}) WHERE #{table}.id = #{self.id} RETURNING #{table}.*})
    return result[0]
end

#prepare_array_query(field) ⇒ Object



42
43
44
45
46
# File 'lib/atomic_arrays.rb', line 42

def prepare_array_query(field)
    table = self.class.table_name.inspect
    field = field.to_s.inspect
    return [table, field]
end

#prepare_array_vals(value) ⇒ Object



48
49
50
51
52
# File 'lib/atomic_arrays.rb', line 48

def prepare_array_vals(value)
    prep_array = []
    [*value].map {|val| val = "\'#{val}\'" if val.class == String; prep_array.push(val)}
    return prep_array.join(", ")
end