Было бы лучше вообще не иметь этого условия, чем использовать *.В этом случае все просто, так как все ваши операторы сравнения - "=".Это означает, что вы можете использовать хэш-форму условий.Ваш код также довольно неэффективен, так как вы загружаете один и тот же объект отчета 3 или 4 раза.Ваш вопрос о том, что один из параметров является нулевым, не имеет смысла по этой причине: вы просто используете один и тот же параметр снова и снова.Также вы устанавливаете переменную с именем @report в качестве объекта проблемы, который сбивает с толку.
@report = Report.find_by_id(params[:id])
conditions = {:cause_id => @report.cause_id, :location_id => @report.location_id, :device_id => @report.device_id, :priority_id => @report.priority_id}
conditions.delete_if{|k,v| v.blank?}
@problem = Problem.find(:all, :conditions => conditions)