[英]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.