如何通过Rails Active Record SQL Server Adapter查询哈希/JSON字段
如何用Active Record SQL Server Adapter查询JSON字段的单个值
既然你已经把properties字段改成SQL Server的JSON类型并通过JSON序列化存储,完全可以查询其中的summary字段。SQL Server有专门的JSON处理函数,之前用的PostgreSQL语法(->>)不适用,下面是正确的实现方式:
1. 精确匹配查询
如果需要精确匹配summary的内容:
@requests = current_user.requests.where("JSON_VALUE(properties, '$.summary') = ?", params[:filter]) if params[:filter].present?
2. 模糊匹配查询
从你之前的代码看,应该是要做模糊搜索,用LIKE关键字配合JSON_VALUE即可:
@requests = current_user.requests.where("JSON_VALUE(properties, '$.summary') LIKE ?", "%#{params[:filter]}%") if params[:filter].present?
注:这里的字符串插值是安全的,
params[:filter]会被Active Record自动转义后替换到占位符,不会有SQL注入风险。
3. 模型字段配置(可选)
确保你的模型正确配置了字段的序列化规则,Rails 5及以上版本可以直接指定类型:
class Request < ApplicationRecord belongs_to :user attribute :properties, :json end
如果是旧版本Rails,使用serialize方法:
class Request < ApplicationRecord belongs_to :user serialize :properties, JSON end
补充说明
JSON_VALUE是SQL Server提取JSON字段单个值的核心函数,第二个参数是JSON路径,$.summary表示根节点下的summary键;如果是嵌套结构(比如properties->details->title),路径写成$.details.title即可。- 若需要判断JSON字段中是否存在某个键,可以用
JSON_QUERY或者ISJSON辅助验证。
内容的提问来源于stack exchange,提问作者spacerobot
相关产品推荐
相关产品推荐

