Рубин на рельсах, поиск логики и рефакторинг
Я не слишком знаком с плагином searchlogic для рельсов (я просматривал Railscasts, но мне не помог этот код, приведенный ниже). Кто-нибудь может кратко описать, как он используется в трех методах ниже? Спасибо за любой ответ.
def extract_order
@order_by = if params[:order].present?
field = params[:order].gsub(".", "_")
field = field.starts_with?('-') ? 'descend_by_'+field[1..-1] : 'ascend_by_'+field
field.to_sym
else
# Workaround
'searchlogic'.to_sym
end
end
def find_resources
@search_conditions = params[:search_conditions] || {} # See http://www.binarylogic.com/2008/11/30/searchlogic-1-5-7-complex-searching-no-longer-a-problem/
@resources = @resource_model.send(@order_by).searchlogic(:conditions => @search_conditions)
end
def apply_filters
f = filter_by
f.each do |filter_field|
filter_constraints = params[filter_field.to_sym]
if filter_constraints.present?
# Apply searchlogic's scope
@resources.send(filter_field,filter_constraints)
end
end
end
1 ответ
Метод apply_filter не вызывается.
Метод find_resources использует содержимое из @order_by (несмотря на то, что метод извлечения порядка не вызывается)
Таким образом, поиск в модели ресурсов выполняется с использованием параметров (возможно, введенных пользователем), хранящихся в условии поиска переменной, и с помощью @order_by, чтобы указать порядок, который он должен использовать.
Обратите внимание, что ваше приложение получает какой-то параметр и меняет "." на "_" и получение подстроки (1..-1, фактически удаляя первый символ, и используя его в качестве параметра для поиска по области (ascend_by_|deend_by_).
это функция от searchlogic, и вы можете использовать ее в качестве динамического поиска: ascend_by_name_of_field.
ИМО, это выглядит грязно. Вы предполагаете, что @order_by не пуст и что функция extract_order уже запущена. Другое дело, что действия, которые не взаимодействуют с пользователем, не должны быть доступны.