【问题标题】:ruby on rails, searchlogic and refactoringruby on rails, searchlogic 和重构
【发布时间】:2011-02-16 13:43:22
【问题描述】:

我对 rails 的 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

【问题讨论】:

    标签: ruby-on-rails sorting filtering searchlogic


    【解决方案1】:

    apply_filter 方法没有被调用。

    方法 find_resources 正在使用来自@order_by 的内容(尽管没有调用方法提取顺序)

    因此,资源模型中的搜索是使用存储在变量搜索条件中的参数(可能是用户输入)完成的,并使用@order_by 来说明它必须使用的顺序。

    请注意,您的应用程序正在获取一些参数并更改“。”到“_”并获取一个子字符串(1..-1,实际上删除第一个字符,并将其用作范围搜索的参数(ascend_by_|descend_by_)。
    它是 searchlogic 的一项功能,您可以将其用作动态查找器:ascend_by_name_of_field。

    IMO,它看起来很乱。您假设 @order_by 不为空并且函数 extract_order 已经运行。另一件事,没有用户交互的操作不应该是可访问的。

    【讨论】:

    • 谢谢,但是您认为 filter_by 的值应该是多少?我在想它是 searchlogic 的内置关键字。
    • 其实你是对的。我确实遗漏了一些东西: def filter_by %w(state_key_eq site_num_like school_enabled_eq district_enabled_eq books_enabled_eq) end
    猜你喜欢
    • 2011-07-22
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2015-07-01
    • 2012-03-29
    相关资源
    最近更新 更多