Как связать необязательные критерии Монгоида в отдельных утверждениях? - PullRequest
1 голос
/ 17 марта 2011

Я пытаюсь объединить критерии, основанные на дополнительных параметрах рельсов.

Я хочу иметь возможность одновременно фильтровать на основе выбранных тегов, а также поиска.

Вот текущий код, который работает во всех ситуациях:

if params[:tag] and params[:search] 
  @notes = Note.tagged_with_criteria(params[:tag]).full_text_search(params[:search]) 
elsif params[:tag] 
  @notes = Note.tagged_with_criteria(params[:tag]) 
elsif params[:search] 
  @notes = Note.full_text_search(params[:search]) 
end 

Я попытался просто использовать

  @notes = Note.tagged_with_criteria(params[:tag]).full_text_search(params[:search]) 

без оператора if, но тогда, если только один изпараметры были даны, затем все записи возвращаются.

Каждый из методов (tagged_with_criteria и full_text_search) возвращает Note.criteria, если их параметр равен nil / empty.

Существует ли более простой и изящный способ связать критерии Монгоида, подобные этому?

Я бы предпочел продолжать придерживаться критериев один за другим вместо того, чтобы делать странные вещи "если параметры [...] и параметры [...]" ..

ОБНОВЛЕНИЕ: вот текущие методы:

def tagged_with_criteria(_tags)
  _tags = [_tags] unless _tags.is_a? Array
  if _tags.empty?
    criteria
  else
    criteria.in(:tags => _tags)
  end
end


  def self.full_text_search(query)
    if query
      begin
        regex = /#{query}/
        # supplied string is valid regex (without the forward slashes) - use it as such
        criteria.where(:content => regex)
      rescue
        # not a valid regexp -treat as literal search string
        criteria.where(:content => (/#{Regexp.escape(query)}/))
      end
    else
      # show all notes if there's no search parameter
      criteria
    end
  end

1 Ответ

4 голосов
/ 17 марта 2011

В такой ситуации я бы изменил области видимости, чтобы ничего не делать, если передать пустые значения.

Я думаю, что может произойти, если вы получаете пустые строки из хэша params, который вызывает вашикод, чтобы думать, что что-то было введено.Попробуйте области с этими правками.

def tagged_with_criteria(_tags)
  _tags = Array.wrap(_tags).reject(&:blank?)
  if _tags.empty?
    criteria
  else
    criteria.in(:tags => _tags)
  end
end

def self.full_text_search(query)
  if query.present?
    begin
      regex = /#{query}/
      # supplied string is valid regex (without the forward slashes) - use it as such
      criteria.where(:content => regex)
    rescue
      # not a valid regexp -treat as literal search string
      criteria.where(:content => (/#{Regexp.escape(query)}/))
    end
  else
    # show all notes if there's no search parameter
    criteria
  end
end
...