Использование запросов where в типе данных JSONB в Rails Postgres

Как запросить расписания, у которых есть slot_details, у которых есть пустой session_id. Вот примерный набор данных:

    id: 98,
  consulting_location_doctor_id: 498,
  schedule_date: Thu, 15 Jan 2015 00:00:00 IST +05:30,
  slot_details:
   [{"end"=>"2015-01-15T15:00:00.000+00:00", "start"=>"2015-01-15T14:30:00.000+00:00", "title"=>" 2:30 pm to  3:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T15:30:00.000+00:00", "start"=>"2015-01-15T15:00:00.000+00:00", "title"=>" 3:00 pm to  3:30 pm", appointment_id: ""},
    {"end"=>"2015-01-15T16:00:00.000+00:00", "start"=>"2015-01-15T15:30:00.000+00:00", "title"=>" 3:30 pm to  4:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T16:30:00.000+00:00", "start"=>"2015-01-15T16:00:00.000+00:00", "title"=>" 4:00 pm to  4:30 pm", appointment_id: ""},
    {"end"=>"2015-01-15T17:00:00.000+00:00", "start"=>"2015-01-15T16:30:00.000+00:00", "title"=>" 4:30 pm to  5:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T17:30:00.000+00:00", "start"=>"2015-01-15T17:00:00.000+00:00", "title"=>" 5:00 pm to  5:30 pm", appointment_id: ""},
    {"end"=>"2015-01-15T18:00:00.000+00:00", "start"=>"2015-01-15T17:30:00.000+00:00", "title"=>" 5:30 pm to  6:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T18:30:00.000+00:00", "start"=>"2015-01-15T18:00:00.000+00:00", "title"=>" 6:00 pm to  6:30 pm", appointment_id: ""},
    {"end"=>"2015-01-15T19:00:00.000+00:00", "start"=>"2015-01-15T18:30:00.000+00:00", "title"=>" 6:30 pm to  7:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T19:30:00.000+00:00", "start"=>"2015-01-15T19:00:00.000+00:00", "title"=>" 7:00 pm to  7:30 pm", appointment_id: ""},
    {"end"=>"2015-01-15T20:00:00.000+00:00", "start"=>"2015-01-15T19:30:00.000+00:00", "title"=>" 7:30 pm to  8:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T20:30:00.000+00:00", "start"=>"2015-01-15T20:00:00.000+00:00", "title"=>" 8:00 pm to  8:30 pm", appointment_id: ""},
    {"end"=>"2015-01-15T21:00:00.000+00:00", "start"=>"2015-01-15T20:30:00.000+00:00", "title"=>" 8:30 pm to  9:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T21:30:00.000+00:00", "start"=>"2015-01-15T21:00:00.000+00:00", "title"=>" 9:00 pm to  9:30 pm", appointment_id: ""},
    {"end"=>"2015-01-15T22:00:00.000+00:00", "start"=>"2015-01-15T21:30:00.000+00:00", "title"=>" 9:30 pm to 10:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T22:30:00.000+00:00", "start"=>"2015-01-15T22:00:00.000+00:00", "title"=>"10:00 pm to 10:30 pm", appointment_id: ""},
    {"end"=>"2015-01-15T23:00:00.000+00:00", "start"=>"2015-01-15T22:30:00.000+00:00", "title"=>"10:30 pm to 11:00 pm", appointment_id: ""},
    {"end"=>"2015-01-15T23:30:00.000+00:00", "start"=>"2015-01-15T23:00:00.000+00:00", "title"=>"11:00 pm to 11:30 pm", appointment_id: ""},
    {"end"=>"2015-01-16T00:00:00.000+00:00", "start"=>"2015-01-15T23:30:00.000+00:00", "title"=>"11:30 pm to 12:00 am", appointment_id: ""}],
  start_and_end_time: Thu, 15 Jan 2015...Fri, 16 Jan 2015,
  deleted_at: nil,
  deleted_by_id: nil,
  created_at: Tue, 30 Dec 2014 04:28:06 IST +05:30,
  updated_at: Tue, 30 Dec 2014 04:28:06 IST +05:30>

Я также попробовал пример в руководствах. Нет примера, где запросить массив json. Пожалуйста помоги.


person Aravind    schedule 29.12.2014    source источник
comment
возможный дубликат Как заставить Rails 4.2 работать с Postgres Jsonb ?   -  person khampson    schedule 30.12.2014
comment
По какой-то конкретной причине вы используете для этого JSON? Ваш slot_details выглядит очень последовательно структурированным, возможно, лучше было бы создать отдельную таблицу.   -  person mu is too short    schedule 30.12.2014
comment
@muistooshort Я решил использовать эту структуру, потому что. Строка, которую вы видите, относится к одному дню для одного Consulting_location врача. У врача может быть много таких Consulting_location, у каждого из которых есть несколько слотов на один день. Если я вынесу это как отдельную таблицу, не станет ли она слишком большой очень скоро?   -  person Aravind    schedule 30.12.2014
comment
Также на этот вопрос раньше не было ответа, я пробовал там решение, и оно не помогло. Не было указаний на то, как запрашивать массив json.   -  person Aravind    schedule 30.12.2014
comment
Насколько она будет больше в виде отдельной таблицы, чем в виде встроенного JSON? Я предполагаю, что он будет меньше, быстрее, с ним будет проще работать и он будет иметь доступ к более богатому набору типов данных. Вы даже можете установить надлежащие ограничения целостности.   -  person mu is too short    schedule 30.12.2014
comment
Если у одного врача есть два консультационных пункта и каждый из них имеет 300 рабочих дней, а каждый рабочий день имеет 10 слотов, то у нас всего 3000 строк слотов для одного врача. Разве это не много, учитывая, что будут сотни врачей, которые могут иметь несколько консультационных пунктов, или это нормально? Я согласен с тем, что он может содержать более богатый набор данных   -  person Aravind    schedule 30.12.2014
comment
Итак, если я правильно понимаю, ваш slot_details является столбцом json? И вы хотите запросить, чтобы найти те строки, которые имеют пустой идентификатор встречи, или вы ищете эти пустые элементы в массиве?   -  person Mohamed El Mahallawy    schedule 02.01.2015
comment
@MohamedElMahallawy Я ищу пустой элемент в массиве json. То есть пустой appointment_id   -  person Aravind    schedule 02.01.2015


Ответы (1)


Возможно, это могло бы помочь вам:

slot -> 'slot_details' @> '[{"end"=>"2015-01-15T20:00:00.000+00:00"}]'

идея состоит в том, чтобы спросить, содержится ли частичный подмассив. Если бы вы не были в булочке массива в объекте, это было бы вместо этого (скажем, у нас есть объект профиля):

profile -> 'basics' @> '{"name":"john"}'

не дайте себя обмануть, пытаясь использовать здесь ? вместо @>

person PyWebDesign    schedule 23.04.2015