module PostgreSQLCube::Model
Public Instance Methods
by_cube_distance(column_name, cube)
click to toggle source
# File lib/postgresql-cube/model.rb, line 8 def by_cube_distance(column_name, cube) column = arel_table[column_name] cube_values = Arel.sql("'#{ActiveRecord::Type.lookup(:cube).serialize(cube)}'") distance_operation = Arel::Nodes::InfixOperation.new('<->', column, cube_values) distance_column_name = %("#{column_name}_distance") distance = Arel::Nodes::As.new(distance_operation, Arel.sql(distance_column_name)) select_values = all.select_values.presence || [arel_table[Arel.star]] select(*select_values, distance).order(distance_column_name) end
cube_attributes(column_name, *attributes)
click to toggle source
# File lib/postgresql-cube/model.rb, line 18 def cube_attributes(column_name, *attributes) unless type_for_attribute(column_name.to_s).type == :cube raise ArgumentError, "#{column_name} is not a cube column" end attributes.each_with_index do |name, i| define_method name.to_s do self[column_name][i] end define_method "#{name}=" do |value| self[column_name] ||= Array.new(attributes.size, 0) self[column_name][i] = value end end end
similar_by_cube_distance(column_name)
click to toggle source
# File lib/postgresql-cube/model.rb, line 36 def similar_by_cube_distance(column_name) similar = self.class.by_cube_distance(column_name, send(column_name)) similar.where.not(self.class.primary_key => send(self.class.primary_key)) end