我有这样的思维斯芬克斯搜索条件与或运算符:

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

但我必须更改它,这样我可以使用or运算符,但也可以在条件中添加一些if语句:例如,我的params[:descr]为空,所以我不需要通过@description进行搜索(它也会抛出error's)。
我需要一些类似的东西,如果params[:descr]然后没有使用这个部分(@description{params[:descr]})但最好的方法是什么?
也许使用“语法”这样的条件更好更容易:
Oil.search :conditions => {oiliness: "#{params[:oiloiliness].gsub(/[^0-9A-Za-z]/, '')} | #{params[:oiloiliness]}",  params[:descr].present? ? description: "#{params[:descr]" : nil}

像这样的…
也:
ThinkingSphinx::Index.define :oil, :with => :active_record do
  indexes :oiliness
  indexes :structure
  indexes :manufacturer
  indexes :capacity
  indexes :description
end

我也试着:
@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]}

最佳答案

如果您想保持OR逻辑的正确性,那么类似这样的事情就可以做到:

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(' | ')
)

10-07 15:04