[英]Rails custom query based on params
我從JSON請求發送了零個或多個過濾器參數。 參數可能包含:
params[:category_ids"]
params[:npo_ids"]
等等
我正在嘗試使用選定的ID從數據庫中檢索所有項目。 這是我目前擁有的:
def index
if params[:category_ids].present? || params[:npo_ids].present?
@conditions = []
@ids = []
if params["category_ids"].present?
@conditions << '"category_id => ?"'
@ids << params["category_ids"].collect{|x| x.to_i}
end
if params["npo_ids"].present?
@conditions << '"npo_id => ?"'
@ids << params["npo_ids"].collect{|x| x.to_i}
end
@conditions = @ids.unshift(@conditions.join(" AND "))
@projects = Project.find(:all, :conditions => @conditions)
else ...
這確實不起作用,但希望它能使您了解我正在嘗試做的事情。
如何根據不確定的參數篩選ActiveRecord查詢。
也許我可以先執行多個查詢,然后再將它們加入...或者應該在模型中放置一個filter_by_params方法...?
您認為這樣做的好方法是什么?
在Rails 3和更高版本中,您使用ActiveRelation對象構建查詢,直到嘗試訪問結果,SQL才會執行,即
query = Project.where(is_active: true)
# no sql has been executed
query.each { |project| puts project.id }
# sql executed when the first item is accessed
您使用的語法看起來像rails 2樣式; 希望您使用的是3或更高,如果可以,您應該可以執行類似的操作
query = Project.order(:name)
query = query.where("category_id IN (?)", params[:category_ids]) if params[:category_ids].present?
query = query.where("npo_ids IN (?)", params[:npo_ids]) if params[:npo_ids].present?
@projects = query
我解決了 這是我的代碼
def index
if params[:category_ids].present? || params[:npo_ids].present?
@conditions = {}
if params["category_ids"].present?
@conditions["categories"] = {:id => params["category_ids"].collect{|x| x.to_i}}
end
if params["npo_ids"].present?
@conditions["npo_id"] = params["npo_ids"].collect{|x| x.to_i}
end
@projects = Project.joins(:categories).where(@conditions)
else
基本上,它將.where條件存儲在@conditions中,當同時存在類別和npos時,它看起來像這樣:
{:categories => {:id => [1,2,3]}, :npo_id => [1,2,3]}
然后將其插入
Project.joins(:categories).where(@conditions)
似乎有效。
如果要過濾has_many關系,則必須加入。 然后,在加入后,請確保通過執行以下操作來調用您要引用的特定表:
:categories => {:id => [1,2,3]}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.