【问题标题】:Chaining searching and sorting together in rails using serachlogic使用 serachlogic 在 Rails 中将搜索和排序链接在一起
【发布时间】:2011-01-20 16:17:51
【问题描述】:

我的代码和railscasts #240中的很相似

不同之处在于我使用的是 rails 2.3.10,所以我没有使用“where”。相反,我使用的是 serachlogic,我的模型看起来像这样......

//Model.rb
def self.search(search)
      if search
        Model.column_name_like(search)
      else
        find(:all)
      end
    end

(我正在使用搜索逻辑,因为我需要不区分大小写,因为我正在部署到 heroku(postgres))

当我尝试像在 railscast 和其他教程中一样将我的方法链接在一起时,我收到一个错误,例如“找不到方法顺序”

我的控制器在这里...

 @objects=Model.search(params[:search]).order(sort_order('created_at'))

这是一种稍微不同的列排序方法,在我进行搜索之前它对我有用。

为什么这种方法在某些教程中有效,但在这种情况下会抛出错误。是因为教程在rails 3中吗?

【问题讨论】:

    标签: ruby-on-rails ruby sorting searchlogic


    【解决方案1】:

    几天后我自己找到了一个最佳解决方案。我不得不改变我的模型。我没有在 else 中返回 find(:all),而是返回了一个新的“空”搜索对象

    @search=Model.column_name_like("")
    

    预先参考我现在支持排序、搜索和分页的模型和控制器看起来像......

    def self.search(search)
          if search
            Model.column_name_like(search)
          else
            @search=Model.column_name_like("")
          end
        end
    
    def index
      @per_page = params[:per_page] || Lease.per_page || 20
      @search=Lease.search(params[:search])
      @objects=@search.find(:all, :order=>(sort_column + " "+ sort_direction)).paginate(:per_page => @per_page, :page => params[:page])
    end
    
    private 
    def sort_column
      Model.column_names.include?(params[:sort]) ? params[:sort] : "default_column_name"
    end
    
    def sort_direction
      %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
    end
    

    不要忘记在视图中放置隐藏的表单助手以传递列名和方向。

    <p>
    <% form_tag leases_path, :method => 'get' do %>
    <p>
        <%= text_field_tag :search, params[:search] %>
        <%= submit_tag "Search", :name => nil %>
    </p>
    <%=hidden_field_tag :direction, params[:direction]%>
    <%=hidden_field_tag :sort, params[:sort]%>
    
    <% end %>
    

    【讨论】:

      【解决方案2】:

      railscast 似乎没有使用 searchlogic,这解释了为什么这不起作用。它使用 rail3 的新 Active Record (Arel) 库来完成类似搜索逻辑的行为。

      代替:

      @objects=Model.search(params[:search]).order(sort_order('created_at'))

      试试:

      @objects=Model.search(params[:search]).ascend_by_created_at

      或者:

      @objects=Model.search(params[:search]).descend_by_created_at

      干杯

      【讨论】:

      • 可行,但不够灵活。我目前正在使用应用程序助手,因此我可以按列 asc/dsc 进行排序。我还需要在末尾添加分页,例如.. @objects.Model.search(params[:search]).order(sort_order('name')).paginate(:per_page => @per_page, :page = > 参数[:page])
      • 您可以在 params[:search] 参数中传递它而不是 .descend_by_created_at 或 .ascend_by_created_at。所以你可以有 params[:search][:order] = "ascend_by_created_at" 或 params[:search][:order] = "descend_by_created_at",这样你可以对事物有更多的动态控制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2014-07-13
      • 1970-01-01
      • 2013-12-29
      • 2011-06-28
      • 2020-03-27
      • 1970-01-01
      相关资源
      最近更新 更多