在使用 Rails 3.2 和 Postgres hstore 构建应用程序时,我遇到了非 ActiveRecord 模型的问题(目前使用 ActiveAttr,但可以使用其他选项)。简而言之,我需要查询数据库以检索 hstore 中的一组键。据我所知,这只能通过直接的、非 ActiveRecord::Query 语句来实现。
我当前的代码如下所示:
def self.keys(query)
# FIXME Need to determine how to sanitize input
sql = "SELECT DISTINCT key FROM ( SELECT skeys(data) AS key from \"products\" ) AS keys"
if(query && !query.empty?)
sql += " WHERE lower(key) LIKE '%#{query.downcase}%'"
end
ActiveRecord::Base.connection.select_values(sql)
end
这有效,但不会清理 input query
。如果我尝试创建一个数组并将关键行更改为sql += " WHERE lower(key) LIKE ?"
我的日志中出现此错误:
Could not log "sql.active_record" event. NoMethodError: undefined method `squeeze' for #<Array:0x007fd9968704e8>
TypeError: wrong argument type Array (expected String): ["SELECT DISTINCT key FROM ( SELECT skeys(data) AS key from \"products\" ) AS keys WHERE lower(key) LIKE ?", "%o%"]
是否可以在外部调用适当的清理方法,或者至少在我的模型中执行相同的逻辑?