2015-02-06 49 views
1

我在ruby應用程序中有一個過濾器數組,它對Postgres連接進行原始SQL查詢。我試圖找出如何我可以序列化這個數組到的東西可查詢,Ruby + Sequel - 將數組序列化爲文本數組查詢

即:SELECT * FROM data WHERE strings IN #{strings_array}

我無法找到任何資源這一點。什麼是序列化這個查詢的正確方法?

編輯:我最終搞清楚:

query = '' 
arr.each_with_index { |e, i| 
    if i == arr.length - 1 
    query += "#{e}" 
    else 
    query += "#{e}," 
    end 
} 

然後

" AND column @> ('{#{query}}')"

但必須有一個更簡潔的方式,不是嗎?

# I presume arr contains an array that you want serialize 
strings_array = "'#{arr.join("','")}'" 
query = "SELECT * FROM data WHERE strings IN #{strings_array}" 
+0

想要序列化數據數組或對數據進行查詢嗎? – Jesper 2015-02-06 08:11:09

+0

@Jesper - 我想查詢一個可變數組數組。例如,我有一個像'names = ['Jason','Bob','Chris']'這樣的字符串數組,我想將'names'嵌入到查詢字符串中,這樣我就可以匹配列'first_names'其中'names'數組中的值在該行中 – jtmarmon 2015-02-06 08:16:31

回答

1

如果使用join方法這樣這可能是更簡潔。續集可以自動執行這種查詢:

DB[:data].where(strings: ["my", "array", "of", "strings"]) 
# => #<Sequel::Postgres::Dataset: "SELECT * FROM \"data\" WHERE (\"strings\" IN ('my', 'array', 'of', 'strings'))"> 

「手動」構造SQL查詢是有風險的,特別是如果你正在處理來自用戶的數據來。

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – splrs 2015-02-06 09:39:21

+0

@splrs我更新我的答案以獲得更好的理解 – 2015-02-06 09:49:13

2

你說你使用續集:

-2

一旦你學會了解ORM(在這種情況下是Activerecord),你將不會像你一樣手動或半自動地構建SQL。以這個例子爲例,它創建一個到數據庫的連接(在這種情況下是Oracle),將表映射到一個Ruby類,併爲該類提供所有類型的Manupulation方法。 在這個例子中,我使用了兩個地方,一個用哈希作爲過濾器,另一個用一點SQL。結果將是一個SQL,一旦你對它做了什麼,它就會自動生成並執行(在這種情況下使用每個SQL)。

require 'active_record' 

ActiveRecord::Base.establish_connection(
    :adapter => 'oracle_enhanced', 
    :database => "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = ORATCP.world)(PROTOCOL = TCP)(Host = server.domain)(Port = 9999)))(CONNECT_DATA = (SID = SID_ID)))", 
    :username => 'user', 
    :password => 'password' 
) 

class Member < ActiveRecord::Base 
    self.table_name = 'my_table' 
end 

Member.where(country: 'Belgium').where("'gender = 'M'").each do |member| 
    p member 
end