7

我有一个 Deal 模型,它有一个名为“info”的属性,其结构如下:

在交易的“信息”栏内:

Deal1.info = [{"deal_id":"4","text1":"qqq","text2":"sqsq","image1":"sqqs","video1":"sqsq"},{"deal_id":"5","text1":"sqqs","text2":"qq"}]

# no image here inside the json
Deal2.info = 
[{"deal_id":"4","text1":"qqq","video1":"sqsq"},{"deal_id":"5","text1":"sqqs","text2":"qq"}]

该列在 mligration 中定义为 json

add_column :deals, :info, :json, default: '[]'

如何使用活动记录在 jsonb 中查询这个?

  • 查找 infos 至少包含一个 deal_id = 4 的所有交易

  • 找到所有的交易,其中 infos 至少包含一个带有名为“image1”的键的 json 块({})(它应该只输出 Deal1,而不是 deal2)

4

1 回答 1

13

我有一个类似的列,我必须将列类型从 更改jsonjsonb

add_column :deals, :info, :jsonb, default: [], null: false, index: true

在获得数据类型后,jsonb我能够执行这种类型的 activerecord 查询。

Info.where('deals @> ?', '[{"deal_id":"4"}]')

我不太确定如何使用 activerecord (http://www.postgresql.org/docs/9.4/static/functions-json.html#FUNCTIONS-JSONB-OP-TABLE)编写所有这些来实现你的第二个要点。

于 2015-07-21T05:18:00.757 回答