簡體   English   中英

Rails:將可選參數組合到查詢中

[英]Rails: combining optional params into a query

我有一個視圖,其中有大量需要過濾的記錄分頁列表。

用戶可以通過幾種不同的方式對記錄進行過濾(例如“保存”記錄,“讀取”記錄和“標記已刪除”記錄),我希望他們能夠以任何可能的方式組合這些過濾器。

我當前的,有缺陷的,無法正常工作的方法。 除非所有參數均已指定且有效,否則以下代碼不會產生任何結果:

#view. Set the 'se' filter to true; leave all others as is 
<%= link_to list_url(:id=>params[:id], :se=>"true", :st=>params[:st], :re=>params[:re]) do %> 
  <div class="button">Toggle SE</div>
<% end %>

#controller query. Add whichever params are passed into the conditions for the new page.
#query is paginated and sorted
@records = Record.where("user_id IN (?) AND see = ? AND star = ? AND delete = ? AND like = ?", @users.select("id"), params[:se], params[:st], params[:re]).paginate :page => params[:page], :order => (sort_column + " " + sort_direction)

創建此過濾系統的最佳方法是什么?
我想客戶端排序比每次要求服務器參與都要快-是否有一種簡單的AJAX方法來完成這種事情? 想象一下,用戶可以任意組合打開和關閉過濾器。

嘗試這個:

conditions = {:user_id => @users.select("id")}
{
 :se => :see,
 :st => :star,
 :del => :delete
}.each{|k1, k2| conditions[k2] = params[k1] unless params[k1].blank?}

@records = Record.where(conditions).paginate(...)

conditions哈希將基於params哈希中存在的值進行填充。

編輯1

您可以組合條件哈希和數組。

@records = Record.where(conditions).where(
  ":created_at > ?",  Date.today - 30).paginate(...)

您可以通過指定將user_id條件更改為所需的條件

conditions[:user_id] = @user.id

在上面的語句中,如果RHS是一個數組,則rails會自動生成IN子句。 否則,執行相等性檢查( = )。

也可以使用匿名作用域: 在Rails中組合條件數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM