Запрос Active Record на первое значение в сохраненном массиве в столбце JSONB - PullRequest
0 голосов
/ 30 октября 2018

У меня есть сценарий, в котором для элемента я записываю даты, когда он был '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)

1 Ответ

0 голосов
/ 30 октября 2018

Это должно работать:

Item.where("active_at->'dates'->>0 = ?", "2018-10-20")

SQL Fiddle

Я был бы действительно обеспокоен производительностью этого запроса и рассмотрел бы некоторые изменения схемы.

...