Соответствие записи базы данных в Rails 6 на основе параметров входящего запроса API - PullRequest
2 голосов
/ 10 июля 2020

У меня есть API с тремя моделями: Веб-сайт, Сообщение, Условие.

  • Веб-сайт имеет много сообщений
  • В сообщении много условий
  • Модель условия STI и имеет несколько типов

Вот пример сообщения

#<Message:0x00007fb4e82fa0e0> {
  :body => nil,
  :created_at => Wed, 08 Jul 2020 20:06:53 UTC +00:00,
  :id => 1,
  :website_id => 1,
  :subtitle => nil,
  :title => "msg 1",
  :updated_at => Wed, 08 Jul 2020 20:06:53 UTC +00:00
}

и его условия

[
  [0] #<Condition::StorefrontPage:0x00007fb4e1b24420> {
    "condition_active" => true,
    "condition_attributes" => {
      "account" => false,
      "blogs" => false,
      "cart" => false,
      "collections" => false,
      "everywhere" => false,
      "homepage" => false,
      "pages" => true,
      "products" => false
    },
    "created_at" => Wed, 08 Jul 2020 20:06:53 UTC +00:00,
    "id" => 1,
    "message_id" => 1,
    "title" => nil,
    "type" => "Condition::PageDetails",
    "updated_at" => Wed, 08 Jul 2020 20:06:53 UTC +00:00
  },
  [1] #<Condition::Geolocation:0x00007fb4ec137dd0> {
    "condition_active" => true,
    "condition_attributes" => {
      "country_code" => "US"
    },
    "created_at" => Wed, 08 Jul 2020 20:06:53 UTC +00:00,
    "description" => nil,
    "id" => 2,
    "message_id" => 1,
    "title" => nil,
    "type" => "Condition::Geolocation",
    "updated_at" => Wed, 08 Jul 2020 20:06:53 UTC +00:00
  }
]

API получает параметры в GET запрос со страницы веб-сайта, например:

{
  website_id: "1",
  page_attributes: {
    page_type: "page",
    page_handle: "contact-us"
  },
  geolocation_attributes: {
    country_code: "CA",
    region_code: "BC",
    city: "victoria"
  }
}

Эти параметры описывают страницу и источник запроса.

Условия сообщения могут соответствовать любому или ни одному из входящих атрибутов.

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

Еще одна проблема заключается в том, что атрибуты условия хранятся в столбце jsonb, и я не могу добавить его к этому:

# How can I merge this
# DisplayCondition.where("condition_attributes->>'country_code' = ?", "CA")
# Into...
Message.joins(:conditions).where(:conditions => {:type => "Condition::Geolocation"})

TIA ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...