Sha256: a7d23ce6cd4ac17d87a1fe0a572fcdd27f7bf97894d5294557818b36fd5054dd
Contents?: true
Size: 1.73 KB
Versions: 3
Compression:
Stored size: 1.73 KB
Contents
require "active_support/core_ext/module/delegation" module PgSearch class ScopeOptions delegate :connection, :quoted_table_name, :sanitize_sql_array, :to => :@model def initialize(name, config) @name = name @config = config @model = config.model @feature_options = Hash[config.features] end def apply(scope) scope.select("#{quoted_table_name}.*, (#{rank}) AS pg_search_rank").where(conditions).order("pg_search_rank DESC, #{order_within_rank}").joins(joins) end private def conditions @config.features.map do |feature_name, feature_options| "(#{sanitize_sql_array(feature_for(feature_name).conditions)})" end.join(" OR ") end def order_within_rank @config.order_within_rank || "#{primary_key} ASC" end def primary_key "#{quoted_table_name}.#{connection.quote_column_name(@model.primary_key)}" end def joins @config.associations.map do |association| association.join(primary_key) end.join(' ') end FEATURE_CLASSES = { :dmetaphone => Features::DMetaphone, :tsearch => Features::TSearch, :trigram => Features::Trigram } def feature_for(feature_name) feature_name = feature_name.to_sym feature_class = FEATURE_CLASSES[feature_name] raise ArgumentError.new("Unknown feature: #{feature_name}") unless feature_class normalizer = Normalizer.new(@config) feature_class.new( @config.query, @feature_options[feature_name], @config.columns, @config.model, normalizer ) end def rank (@config.ranking_sql || ":tsearch").gsub(/:(\w*)/) do sanitize_sql_array(feature_for($1).rank) end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
pg_search-0.5.4 | lib/pg_search/scope_options.rb |
pg_search-0.5.3 | lib/pg_search/scope_options.rb |
pg_search-0.5.2 | lib/pg_search/scope_options.rb |