Я пытаюсь объединить критерии, основанные на дополнительных параметрах рельсов.
Я хочу иметь возможность одновременно фильтровать на основе выбранных тегов, а также поиска.
Вот текущий код, который работает во всех ситуациях:
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