使用serachlogic链接搜索和排序在rails中

时间:2011-01-20 16:17:51

标签: ruby-on-rails ruby sorting searchlogic

我的代码与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中吗?

2 个答案:

答案 0 :(得分:1)

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

@search=Model.column_name_like("")

Fore reference我现在支持排序,搜索和分页的模型和控制器看起来像......

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 %>

答案 1 :(得分:0)

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

而不是:

@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

欢呼声