簡體   English   中英

基於參數的Rails自定義查詢

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

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