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