Search code examples
ruby-on-railsrubythinking-sphinx

Thinking sphinx conditions with if statement


I have such thinking sphinx search condition with or operator:

Oil.search "(@oiliness #{params[:oiloiliness].gsub(/[^0-9A-Za-z]/, '')} | @oiliness #{params[:oiloiliness]}) | (@description #{params[:descr]}) 

but i must change it so, that i can use my or operator, but also add some if statement in condition: for example my params[:descr] is empty, so i didn't need to search via @description (also it will throw error's).

I need something like if params[:descr] then didn't use this part (@description #{params[:descr]}) . But what is the best way of doing this?

Maybe it is better and easier to use conditions "syntax" like:

Oil.search :conditions => {oiliness: "#{params[:oiloiliness].gsub(/[^0-9A-Za-z]/, '')} | #{params[:oiloiliness]}",  params[:descr].present? ? description: "#{params[:descr]" : nil}

something like this...

also:

ThinkingSphinx::Index.define :oil, :with => :active_record do
  indexes :oiliness
  indexes :structure
  indexes :manufacturer
  indexes :capacity
  indexes :description
end

also i try:

@pre_oils = Oil.search :conditions => {oiliness: "#{params[:oiloiliness].gsub(/[^0-9A-Za-z]/, '')} | #{params[:oiloiliness]}", description: "#{params[:oiloiliness].gsub(/[^0-9A-Za-z]/, '')} | #{params[:oiloiliness]}", capacity: params[:oilsize], manufacturer: params[:oilbrand]}

Solution

  • If you want to keep the OR logic in place, something like this should do the trick:

    fields = ["@oiliness #{params[:oiloiliness].gsub(/[^0-9A-Za-z]/, '')} | @oiliness #{params[:oiloiliness]}"]
    fields << "@description #{params[:descr]}" if params[:descr].present?
    
    Oil.search(
      fields.collect { |field| "(#{field})" }.join(' | ')
    )