class ThinkingSphinx::ActiveRecord::Attribute::Type

Constants

UPDATEABLE_TYPES

Attributes

attribute[R]
model[R]

Public Class Methods

new(attribute, model) click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 4
def initialize(attribute, model)
  @attribute, @model = attribute, model
end

Public Instance Methods

multi?() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 8
def multi?
  @multi ||= attribute.options[:multi] || multi_from_associations
end
timestamp?() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 12
def timestamp?
  type == :timestamp
end
type() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 16
def type
  @type ||= attribute.options[:type] || type_from_database
end
type=(value) click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 20
def type=(value)
  @type = attribute.options[:type] = value
end
updateable?() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 24
def updateable?
  UPDATEABLE_TYPES.include?(type) && single_column_reference?
end

Private Instance Methods

associations() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 32
def associations
  @associations ||= begin
    klass = model
    attribute.columns.first.__stack.collect { |name|
      association = klass.reflect_on_association(name)
      klass       = association.klass
      association
    }
  end
end
big_integer?() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 43
def big_integer?
  database_column.type == :integer && database_column.sql_type[/bigint/i]
end
column_name() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 47
def column_name
  attribute.columns.first.__name.to_s
end
database_column() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 51
def database_column
  @database_column ||= klass.columns.detect { |db_column|
    db_column.name == column_name
  }
end
klass() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 57
def klass
  @klass ||= associations.any? ? associations.last.klass : model
end
multi_from_associations() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 61
def multi_from_associations
  associations.any? { |association|
    [:has_many, :has_and_belongs_to_many].include?(association.macro)
  }
end
single_column_reference?() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 67
def single_column_reference?
  attribute.columns.length == 1               &&
  attribute.columns.first.__stack.length == 0 &&
  !attribute.columns.first.string?
end
type_from_database() click to toggle source
# File lib/thinking_sphinx/active_record/attribute/type.rb, line 73
def type_from_database
  raise ThinkingSphinx::MissingColumnError,
    "column #{column_name} does not exist" if database_column.nil?

  return :bigint if big_integer?

  case database_column.type
  when :datetime, :date
    :timestamp
  when :text
    :string
  when :decimal
    :float
  else
    database_column.type
  end
end