我在ruby应用程序中有一个过滤器数组,它们对Postgres连接进行原始SQL查询。我试图找出如何将这个数组序列化为可查询的内容,
即: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}}')"
但必须有一个不那么冗长的方式,不是吗?
答案 0 :(得分:2)
如果您使用join
这样的方法,这可能会更简洁:
# I presume arr contains an array that you want serialize
strings_array = "'#{arr.join("','")}'"
query = "SELECT * FROM data WHERE strings IN #{strings_array}"
答案 1 :(得分:2)
你说你使用续集。续集可以自动执行这种查询:
DB[:data].where(strings: ["my", "array", "of", "strings"])
# => #<Sequel::Postgres::Dataset: "SELECT * FROM \"data\" WHERE (\"strings\" IN ('my', 'array', 'of', 'strings'))">
手工构建SQL查询&#34;&#34;风险很大,特别是如果您处理来自用户的数据。
答案 2 :(得分:-2)
一旦你学会了解ORM(在这种情况下是Activerecord),就不会像你那样手动或半自动地构建SQL。以此示例为例,它创建了与数据库的连接(在本例中为Oracle),将表映射到Ruby类,并为该类提供所有类型的管理方法。 在这个例子中,我使用两个where,一个带有散列作为过滤器,另一个带有一点点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