У меня есть 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 ?