Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Problem with WHERE clause for STI models #353

Closed
kot-begemot opened this Issue · 1 comment

2 participants

@kot-begemot

Here is a brief description of the problem we faced:

Model Structure is as follows:

class User < ActiveRecord::Base
  ...
end

class Employee < User
   define_index do
    indexes name
    indexes subjects(:id), as: :subject_ids
    indexes subjects(:name), as: :subject_names

    has profile.location.city(:name), as: :city
  end
end

class Tutor < Employee
  ...
end

class AcademyTutor < Employee
  ...
end

Here Employee class is used as a proxy class, so no actual record is saved with 'Employee' type. That was the problem, as generated configuration contains following:

source employee_core_0
{
  ...
  sql_query = ... WHERE "users"."type" IN ('Employee', 'AcademyTutor', 'Tutor') AND ("users"."id" >= $start AND "users"."id" <= $end AND "users"."type" = 'Employee') ...
  ...
}

As it clearly seen from here where clause contains two things:

  • WHERE "users"."type" IN ('Employee', 'AcademyTutor', 'Tutor') is generated by ActiveRecord::Relation
  • "users"."id" >= $start AND "users"."id" <= $end AND "users"."type" = 'Employee' generated by Thinking sphinx

So having "users"."type" = 'Employee' part is not compulsory and in fact obstruct indexing process in this case. This part is added during the source initialization:

module ThinkingSphinx
  class Source
    def initialize(index, options = {})
      ...
      unless @model.descends_from_active_record?
        stored_class = @model.store_full_sti_class ? @model.name : @model.name.demodulize
        @conditions << "#{@model.quoted_table_name}.#{quote_column(@model.inheritance_column)} = '#{stored_class}'"
      end
      ...
    end
  end
end

Its being added into conditions in this case, and later interfere with sql. This part is a bit unclear for us, as in case of a User model being indexed, it will not take a play. On the other hand, ActiveRecord::Relation (for rails >= 3.0, can't tell anything about lower versions) includes that by default if it is compulsory. Hence (at least for Rails 3.0 and above) we guess it can be ignored.

@kot-begemot

Actually, 2.0.11 anyway dependent on activerecord 3.0.3. In that case type condition is not required, as it will be there anyway.

@kot-begemot kot-begemot referenced this issue from a commit in kot-begemot/thinking-sphinx
E-Max [#353] Added test for Inherited and decendent model ddf20d9
@pat pat closed this in d26aac8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.