module AtomicArrays

Constants

VERSION

Public Class Methods

included(klass) click to toggle source
# File lib/atomic_arrays.rb, line 5
def self.included(klass)
    klass.class_eval do
      extend AtomicClassMethods
    end
end

Public Instance Methods

atomic_append(field, value) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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