# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 56 def primary_key_for(model) model = NO_MODEL unless model.respond_to?(:primary_key) @primary_keys ||= {} @primary_keys[model] ||= index_for(model).primary_key end
class ThinkingSphinx::Middlewares::ActiveRecordTranslator::Inner
Attributes
context[R]
Public Class Methods
new(context)
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 20 def initialize(context) @context = context end
Public Instance Methods
call()
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 24 def call results_for_models # load now to avoid segfaults context[:results] = if sql_options[:order] results_for_models.values.first else context[:results].collect { |row| result_for(row) } end end
Private Instance Methods
ids_for_model(model_name)
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 38 def ids_for_model(model_name) context[:results].collect { |row| row['sphinx_internal_id'] if row['sphinx_internal_class'] == model_name }.compact end
index_for(model)
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 44 def index_for(model) return NO_INDEX unless context[:indices] context[:indices].detect { |index| index.model == model } || NO_INDEX end
model_names()
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 50 def model_names @model_names ||= context[:results].collect { |row| row['sphinx_internal_class'] }.uniq end
model_relation_with_sql_options(relation, model_sql_options)
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 90 def model_relation_with_sql_options(relation, model_sql_options) relation = relation.includes model_sql_options[:include] if model_sql_options[:include] relation = relation.joins model_sql_options[:joins] if model_sql_options[:joins] relation = relation.order model_sql_options[:order] if model_sql_options[:order] relation = relation.select model_sql_options[:select] if model_sql_options[:select] relation = relation.group model_sql_options[:group] if model_sql_options[:group] relation end
primary_key_for(model)
click to toggle source
reset_memos()
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 63 def reset_memos @model_names = nil @results_for_models = nil end
result_for(row)
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 68 def result_for(row) results_for_models[row['sphinx_internal_class']].detect { |record| record.public_send( primary_key_for(record.class) ) == row['sphinx_internal_id'] } end
results_for_models()
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 76 def results_for_models @results_for_models ||= model_names.inject({}) do |hash, name| model = name.constantize model_sql_options = sql_options[name] || sql_options hash[name] = model_relation_with_sql_options(model.unscoped, model_sql_options).where( primary_key_for(model) => ids_for_model(name) ) hash end end
sql_options()
click to toggle source
# File lib/thinking_sphinx/middlewares/active_record_translator.rb, line 99 def sql_options context.search.options[:sql] || {} end