
[Anonymous]
01.12.2016
09:13:45
Создам огромное кол-во анкет с огромным кол-вом полей.

Alex
01.12.2016
09:16:07
Но полей может быть довольно много на самом деле.

Google

[Anonymous]
01.12.2016
09:16:18
Конкретно.
С другими решениями - другие проблемы.

Alex
01.12.2016
09:16:34
Плюс с json появляются проблемы типа "удалил поле, что делать со старыми полями?"

[Anonymous]
01.12.2016
09:16:46
Да хрен с ними, они уникальны для одной анкеты.

Alex
01.12.2016
09:17:04
Ну смотри
у тебя есть список полей с типом
для анкеты. И кто то заполнил анкету
теперь владелец анкеты удалил поле. Как отобразить старое поле?

[Anonymous]
01.12.2016
09:17:39
Где отображать?
В ответе? Ответ сохранит старое поле, оно же в JSON будет.

Alex
01.12.2016
09:17:55
На вебморде
результаты надо же как то агрегировать или отображать.

Google

[Anonymous]
01.12.2016
09:18:06
Анкета - набор полей в JSON.
Ответы - ответы в JSON.
Связи между ними никакой вообще.

Alex
01.12.2016
09:18:22
Теперь ты на вебморде один из результатов заполнения выводишь

Alexander
01.12.2016
09:18:27

Alex
01.12.2016
09:18:27
А тип поля ты не знаешь, что делать?
избыточность?

[Anonymous]
01.12.2016
09:18:35
"key" => "value"

Alex
01.12.2016
09:18:42
Потому что это поле было удалено

[Anonymous]
01.12.2016
09:18:46
Название поля и ответ.

Alex
01.12.2016
09:18:49
поле может хранить дату например

[Anonymous]
01.12.2016
09:18:50

Alex
01.12.2016
09:19:00
Оно было удалено из анкеты, а в json ответе осталось
Как отобразить это поле в вебморде теперь?

[Anonymous]
01.12.2016
09:19:16

Alexander
01.12.2016
09:19:19

[Anonymous]
01.12.2016
09:19:25

Alexander
01.12.2016
09:19:28
но с объектом непонятно что будет ключами

[Anonymous]
01.12.2016
09:19:36
Я, право, не понимаю, о чём сейчас речь.

Google

Alex
01.12.2016
09:19:48

[Anonymous]
01.12.2016
09:19:58
Его и показываем. Если не нужно, то не показываем.

Alex
01.12.2016
09:20:06
Теперь мы не знаем как вывести garage_sell_date
потому что мы не знаем его тип.

Alexander
01.12.2016
09:20:15

[Anonymous]
01.12.2016
09:20:19
Мы, видимо, про разные вещи.

Alexander
01.12.2016
09:20:21
ибо не находим в вопросах
если массив — то будут проблемы

[Anonymous]
01.12.2016
09:20:37
В зависимости от задачи, опять же.

Alex
01.12.2016
09:21:01
Просто с реляционным подходом это проще решить

Alex
01.12.2016
09:21:39
Впрочем все как правило опирается в задачи бизнес логики, и тогда уже надо выбирать вариант
Где то json очень катит.

Alexander
01.12.2016
09:21:57
условно говоря, anketa.each { |name, type| display answer[name] }
и если в answer есть что-то, чего нет в анкете — просто не отобразится

Alex
01.12.2016
09:22:15
ну да, я почему то об этом не подумал.
Но получается что мы в базе храним поле которого в анкете уже нет. А вот ответить нужно ли хранить данные по удаленному полю или нет может только бизнес.

Alexander
01.12.2016
09:22:48

Alex
01.12.2016
09:23:16
Закроем тему на основании того что у нас недостаточно данных какое решение лучше именно для того кто спрашивал

Alexander
01.12.2016
09:23:22

Google

Alexander
01.12.2016
09:23:28

Alex
01.12.2016
09:23:52
Ну у jsonb неприятные такие запросики, и скорость значительно меньше чем у обычных полей.
но для документов jsonb оочень катит.

Alexander
01.12.2016
09:24:37
вспоминая рекомендации «профессионалов масштабирования» много лет назад, нужно на каждую анкету таблицу в бд создавать!

Alex
01.12.2016
09:29:12
Это энтерпрайз
у них может быть по тысяче табличек в базе

Denis
01.12.2016
11:24:08
всем привет, написал метод поиска всех записе по словам из строки
def self.search_by_title(title)
words = title.to_s.downcase.strip.split.uniq
words.map! { |word| "title LIKE '%#{word}%'" }
sql = words.join(' OR ')
self.where(sql)
end
но если в строке есть ', то получается беда и пишет
Recipe Load (0.6ms) SELECT "recipes".* FROM "recipes" WHERE (title LIKE '%test's%') ORDER BY "recipes"."id" DESC LIMIT 1
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "s"
LINE 1: ...ecipes".* FROM "recipes" WHERE (title LIKE '%test's%') ORDE...
как это можно решить?)

Admin
ERROR: S client not available

Alex
01.12.2016
11:24:47
потому что надо использовать prepared statements
вместо интерполяции строки
У тебя вообще логика не правильно построена, юзай AR для создания запроса а не сам его рисуй
тогда и prepared statements Будут

Alexander
01.12.2016
11:25:38
http://stackoverflow.com/a/19105790
первый же результат поиска
не ленитесь

Alex
01.12.2016
11:25:44
Да и для поиска есть инструмент получше.

Denis
01.12.2016
11:26:29
ок, спасибо всем, ща буду разбираться)

Alexander
01.12.2016
11:30:49

Alex
01.12.2016
11:31:07
для постгресса у нас что то для поиска юзалось
правда потом нам это не понравилось и мы на эластику перешли
но может подойти.
какой?
Вроде этот https://github.com/Casecommons/pg_search

Google

Andrii
01.12.2016
19:37:42

Alexander
01.12.2016
19:42:00
https://www.sitepoint.com/n-1-when-more-queries-is-a-good-thing/
ребят, я правильно понимаю, что (условно) 10 запросов из первого скриншота выполняются суммарно быстрее, чем один запрос из второго скриншота?

Nikolay
01.12.2016
19:43:55
по-моему, суть в том, что 10 запросов с первого скриншота выполняются один раз и кэшируются, а один запрос со второго выполняется каждый раз

Alexander
01.12.2016
19:44:26

Nikolay
01.12.2016
19:44:36
чем угодно
бд, в редис

Alexander
01.12.2016
19:45:04
ну вот мне интересно чем: на уровне БД, или гема, или чего-то ещё
я в sequel с postgresql видел подобную ситуацию и призадумался, нужны ли мне джоины, или обычного игера достаточно

Nikolay
01.12.2016
19:46:00
думаю это актуально, когда во вьюхах отображаются записи и там же кэшируются матрешкой
ну и есть identity_cache, который кэширует запросы к БД

Alexander
01.12.2016
19:46:34

Nikolay
01.12.2016
19:46:45
но мне кажется лучше не ебаться и инклудить

Alexander
01.12.2016
19:46:47

Nikolay
01.12.2016
19:46:49
ну статья хуевая значит
да
в рэдисе

Andrii
01.12.2016
19:47:04
первый скриншот: да они кэшируются и суммарное время выполнения 11 ms, второй 52,2

Nikolay
01.12.2016
19:47:04
или мемкеше

Alexander
01.12.2016
19:47:11
омг, ок, ты меня не слышишь