gpt4 book ai didi

ruby-on-rails - 使用 jsonb 数组的 Rails (postgres) 查询

转载 作者:行者123 更新时间:2023-11-29 11:30:51 25 4
gpt4 key购买 nike

我的产品模型有一个 jsonb 字段 specs(我们使用 ActiveRecord 的 store_accessor 对其进行管理)。我的许多产品规范在该散列中都有一个名为 spec_options 的规范。

在此之前,这个 spec_option 字段只是文本。现在它需要是一个数组。

现在用于查询此字段的产品的范围是这样的:

scope :with_spec_options, ->(spec_options) { 
where("'#{spec_options}'::jsonb \? (specs->>'spec_option')")
}

Ruby 等价物(只是为了帮助理解它在做什么):

select{ |product| spec_options.include?(product.specs['spec_option']) }

等效于 ActiveRecord(如果 spec_option 是常规列):

where(spec_option: spec_options)

但是,现在 specs['spec_options'] 是一个数组,我不能那样做。我想我需要使用 postgres 的 ?| jsonb 运算符,但我不知道如何将此操作的右侧转换为正确的格式。

Ruby 等价物:

def self.with_spec_options(spec_options)
all.select{|product|
if product.specs['spec_options'].present?
product.specs['spec_options'].any?{|option|
spec_options.include?(option)
}
else
false
end
}
end

有人有想法吗?

最佳答案

您要使用的是 @> operator ,它测试您的左手值是否包含右手值。 “包含”适用于对象和数组,因此以下查询将有效:

SELECT * FROM products WHERE specs->'spec_options' @> '["spec1", "spec2"]';

我相信您可以像这样将其转换为与 ActiveRecord 兼容的语法:

scope :with_spec_options, ->(spec_options) { 
where("specs->'spec_option' @> ?", spec_options.to_json)
}

关于ruby-on-rails - 使用 jsonb 数组的 Rails (postgres) 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35737931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com