Active Record 查询 JSONB 列上存储数组中的第一个值
Active Record query on first value in stored array on JSONB column
我有一个场景,对于一个项目,我将 'active_at' 的日期记录到存储在 JSONB 列中的数组中。
所以数据看起来像这样:
active_at:
{"dates"=>
["2018-07-22",
"2018-09-05",
"2018-09-06",
"2018-09-07",
"2018-09-14",
"2018-09-15",
"2018-09-16",
"2018-10-20",
"2018-10-21",
"2018-10-30"]}
我可以按如下方式成功查询列以获取数组中的日期匹配:
@item = Item.where('active_at @> ?', {dates: '2018-10-20'.split}.to_json)
但是,我现在只需要能够查询数组中第一个条目的匹配项。数组中的条目始终按日期顺序排列,因为新值会附加到数组末尾。
我尝试过这样的事情,但并不愉快:
@item = Item.where('active_at @> ?', {dates['first']: '2018-10-20'.split}.to_json)
@item = Item.where('active_at @> ?', {dates.first: '2018-10-20'.split}.to_json)
这应该有效:
Item.where("active_at->'dates'->>0 = ?", "2018-10-20")
我真的很关心这个查询的性能并考虑做一些架构更改。
我有一个场景,对于一个项目,我将 'active_at' 的日期记录到存储在 JSONB 列中的数组中。
所以数据看起来像这样:
active_at:
{"dates"=>
["2018-07-22",
"2018-09-05",
"2018-09-06",
"2018-09-07",
"2018-09-14",
"2018-09-15",
"2018-09-16",
"2018-10-20",
"2018-10-21",
"2018-10-30"]}
我可以按如下方式成功查询列以获取数组中的日期匹配:
@item = Item.where('active_at @> ?', {dates: '2018-10-20'.split}.to_json)
但是,我现在只需要能够查询数组中第一个条目的匹配项。数组中的条目始终按日期顺序排列,因为新值会附加到数组末尾。
我尝试过这样的事情,但并不愉快:
@item = Item.where('active_at @> ?', {dates['first']: '2018-10-20'.split}.to_json)
@item = Item.where('active_at @> ?', {dates.first: '2018-10-20'.split}.to_json)
这应该有效:
Item.where("active_at->'dates'->>0 = ?", "2018-10-20")
我真的很关心这个查询的性能并考虑做一些架构更改。