我的代码与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中吗?
答案 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
欢呼声