簡體   English   中英

將多個查詢合並為一個活動記錄關系?

[英]Combine multiple queries into one active record relation?

我正在嘗試為我的應用程序編寫搜索查詢,根據查詢字符串,它將搜索與字符串匹配的組或用戶。

這是我寫的:

    def search_api
      @groups = Group.where("name ILIKE '#{params[:query]}'")
      @users = User.where("first_name ILIKE '#{params[:query]}' OR last_name ILIKE '#{params[:query]}")
    end

有沒有辦法將這兩個查詢組合成一個activerecord關系數組? 除了蠻力迭代兩個數組並將它們放入一個?

我不確定解決方案,但我有一個安全建議。

您的查詢不是SQL注入安全的。 您可以傳遞數組而不是在SQL字符串中注入params。

以下查詢是SQL注入安全的:

@groups = Group.where("name ILIKE ?", "#{params[:query]}")
@users = User.where("first_name ILIKE ? OR last_name ILIKE ?", "#{params[:query]}")

所以這是一個解決方案。 不確定它是否比保留所有內容更好,但正式地說它是一個問題的答案(除了結果不是ActiveRecord關系):

 Group.connection.execute("(SELECT id, 'groups' as table FROM groups WHERE...) UNION (SELECT id, 'users' as table FROM users WHERE...)")

這將返回PG::Result類型的對象,您可以將其視為哈希數組。 並且,正如已經說過的那樣,將參數作為數組傳遞而不是將它們直接插入SQL中是件好事。 不幸的是,如果您希望將結果作為ActiveRecord獲取,則可以僅將UNION用於對一個表的不同查詢。 在這種情況下,它看起來像:

 Group.find_by_sql("(SELECT * FROM groups WHERE...) UNION (SELECT * FROM groups WHERE...)")

暫無
暫無

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

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