昨天用自己的方法實現了排序,所以想“得寸進尺”實現查詢。不過還是找了一個資料才成功=。=|
- routes修改一下:
resources :products do
collection do
get 'search'
end
end
- views中增加:
<%= form_tag "/products/search", method: "get" do %>
<%= label_tag :s_price, "Price" %>
<%= text_field_tag :s_price %>
<%= submit_tag "Search" %>
<% end %>
- controller中增加:
def search
if params[:s_price] == ""
redirect_to :back
else
query = "price like \'%s\'" % params[:s_price]
@products = Product.where(query).paginate(page: params[:page], per_page: 12)
render 'index'
end
end
這樣就實現了對價格的查詢
但有一個問題:查詢完后,點擊表頭想對查詢后的結果進行排序時,又重新查詢了一遍所有的products然后再進行排序。
想了很多“招”,最開始是用request.referer來判斷如果是從查詢結果頁面跳轉到排序頁面,那么就把查詢結果頁面的url中的查詢條件解析出來,查詢后再進行排序。“Bingo!",點了一下排序,居然成功了!還以為自己超給力,結果第二次排序的時候,又變成了對所有products的查詢了,原因就是:當進行了一次排序后,再進行排序request.referer不是查詢頁面了, 而是排序頁面。所以出錯。
OK,再想想有沒有其它的方法。
突然之間,我想到了用cookies來存放查詢語句,先試一下:所以代碼寫成了這樣:
controller中:
def index
@products = Product.all.paginate(page: params[:page], per_page: 12)
query = "1 = 1"
cookies[:query] = query
end
def sort_by
query = cookies[:query]
if @order[:p_by].include?(params[:sort_id])
order_change(@order, params[:sort_id])
@products = Product.where(query).order("%s %s" % params[:sort_id].split("_")[1..2])
@products = @prdutcs.paginate(page: params[:page], per_page: 12)
respond_to do |format|
format.html {render 'index'}
end
else
redirect_to root_path
end
end
def search
if params[:s_price] == ""
redirect_to :back
else
query = "price like \'%s\'" % params[:s_price]
@products = Product.where(query).paginate(page: params[:page], per_page: 12)
cookies[:query] = query
render 'index'
end
end
這次果然成功了!!
但又有一個問題,因為通過cookies的話,必然把數據庫的列名暴露無遺,而我又想不到其它辦法來處理,所以想到把cookies[:query]進行加密,controller中最終代碼如下:
def index
@products = Product.all.paginate(page: params[:page], per_page: 12)
query = "1 = 1"
cookies[:query] = encode(query)
end
def sort_by
query = decode(cookies[:query])
if @order[:p_by].include?(params[:sort_id])
order_change(@order, params[:sort_id])
@products = Product.where(query).order("%s %s" % params[:sort_id].split("_")[1..2])
@products = @products.paginate(page: params[:page], per_page: 12)
respond_to do |format|
format.html {render 'index'}
end
else
redirect_to root_path
end
end
def search
if params[:s_price] == ""
redirect_to :back
else
query = "price like \'%s\'" % params[:s_price]
@products = Product.where(query).paginate(page: params[:page], per_page: 12)
cookies[:query] = encode(query)
render 'index'
end
end
private
def encode(string)
Base64.encode64(Digest::SHA1.hexdigest("tangxiaoyonghaoshuai") + string)
end
def decode(string)
Base64.decode64(string)[40..-1]
end
感覺勉強可以。。。以后學到新的東西再來更新。