0

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

4

2 回答 2

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 %>
于 2011-01-22T15:24:46.817 回答
0

该 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

干杯

于 2011-01-20T17:40:23.020 回答