
Dmitry
07.05.2018
13:49:15
Можно выдумать презентер
Декоратор
Ещё хуй знает что

Vitaly
07.05.2018
13:50:55
ну не будешь же ты выкачивать с бд все 1000 комментариев, чтобы потом разбить их на страницы по 100?

Google

Dmitry
07.05.2018
13:51:17
Я - нет

Vitaly
07.05.2018
13:51:41
ну это больше абстрактное “ты"
никто не будет

Артем
07.05.2018
13:52:36
Например, кол-во комментов на странице это-таки Enum.count(comments) в контроллере либо вьюсе
но уж никак не контекст

Dmitry
07.05.2018
13:54:28
Контроллер нагружать ненужными данными
Нафик надо )
Вьюха

Vitaly
07.05.2018
13:54:52

Артем
07.05.2018
13:55:06
ну формально-то контроллер у нас подготавливает переменные для отображения во вьюсе

Vitaly
07.05.2018
13:55:07
например
это не гуд?

Google

Dmitry
07.05.2018
13:55:17
тут не просто комменты человек считает, а pending, populate, какие-то еще. Фильтровать и считать это эликсиром - долго и не эффектиивно

Vitaly
07.05.2018
13:55:30
+

Артем
07.05.2018
13:55:54

Vitaly
07.05.2018
13:56:17
в контексте функция возвращает тульпу
3 функции
хз

Dmitry
07.05.2018
13:56:48
Если ты в контексте 3 раза в базу сходил

Vitaly
07.05.2018
13:56:58
ну блин

Dmitry
07.05.2018
13:57:01
Может и норм вернуть тупл из трёх переменных

Dmitry
07.05.2018
13:57:09
В чем вообще соль этих контекстов, в них надо реализовывать предметную область/бизнес-логику; считать кол-во тех или иных комментариев - как раз оно и есть

Vitaly
07.05.2018
13:57:11
а как иначе?

Dmitry
07.05.2018
13:57:31
Ну если ты один раз в базу сходил

Vitaly
07.05.2018
13:57:34
1 раз получить комментарии
1 раз количество всех
ну не эликсиром же их считать

Dmitry
07.05.2018
13:58:26
Почему бы и не посчитать

Vitaly
07.05.2018
13:58:58
ну если это будет быстрее - то да :)

Dmitry
07.05.2018
13:59:01
По листу о(н)

Vitaly
07.05.2018
13:59:16
но если есть пагинация

Dmitry
07.05.2018
13:59:17
А комментариев максимум там 1000

Google

Vitaly
07.05.2018
13:59:33
то никак по другому количество всех ты не узнаешь
я просто еще далек от этого
когда ЯП может посчитать быстрее БД :)

Артем
07.05.2018
14:00:33

Dmitry
07.05.2018
14:01:06
да не это количество moi_nik считает

Артем
07.05.2018
14:01:21
та он ваще хз что считает

Dmitry
07.05.2018
14:02:22
ну как бы 2 разные вещи - вернуть кол-во элементов в листе
и сгруппировать их по какому-то условию и считать кол-во

Артем
07.05.2018
14:03:16

Aldar
07.05.2018
14:04:01

Vitaly
07.05.2018
14:04:55

Артем
07.05.2018
14:05:08
о понеслась
можно, давайте нахуевертим трёхэтажный неподдерживаемый sql
неукоснительное соблюдение подобных правил - глупо. всё зависит от контекста
В чем вообще соль этих контекстов, в них надо реализовывать предметную область/бизнес-логику; считать кол-во тех или иных комментариев - как раз оно и есть
попытки запихнуть всё в контекст ничем не лучше любого другого подхода
во главу угла надо ставить читаемость и поддерживаемость кода. если Enum.count() во вью решит задачу - это куда лучше подзапроса в контексте

Vasiliy
07.05.2018
14:08:07
на CircleCI, например, нельзя превышать 4G,
кто-нибудь знает, это можно как-то указать для test-env?
иначе CI просто убьёт процесс и все :)

Артем
07.05.2018
14:08:11
я вот сейчас как раз разгребаю дерьмишко за любителями всего этого

Vitaly
07.05.2018
14:08:22
можно сделать что угодно, если это решает задачу

Google

Артем
07.05.2018
14:08:25
def all(user, :current_user) do
from(
n in __MODULE__,
join: tu in User, on:
tu.id == n.target_user_id,
left_join: tp in Post, on:
tp.id == n.target_post_id,
left_join: su in User, on:
su.id == n.source_user_id,
left_join: sp in Post, on:
sp.id == n.source_post_id,
where:
n.target_user_id == ^user.id,
where: is_nil(tu.deleted_at) and is_nil(tp.deleted_at) and is_nil(su.deleted_at) and is_nil(sp.deleted_at),
group_by: [
n.action,
n.target_user_id,
n.target_post_id,
fragment("round(extract(epoch from ?) / ?)", n.happened_at, @interval)
],
order_by: [desc: fragment("happened_at")],
select: %{
action: n.action,
happened_at: fragment("MAX(happened_at) as happened_at"),
target_posts:

Dmitry
07.05.2018
14:08:34
Если бы вопрос был бы просто вернуть кол-во, то Enum.count был бы решением, но это не тот случай

Артем
07.05.2018
14:08:40
круто жи? бизнес-логика в контексте, о, и подзапросы есть

Vitaly
07.05.2018
14:09:04
как то ужасно

Артем
07.05.2018
14:09:10
полностью постить не стал - там несколько страниц
можно же ещё добавить
и ещё
и ещё
а если сделать виртуальный филд, то ваще всё с базы в одном запросе собрать
охуенно жи?

Vitaly
07.05.2018
14:10:10
ты придумал GraphQL

Артем
07.05.2018
14:10:14
ой, оно выполняется 1300 мс на нескольких тысячах, но ничё? железо же помощнее можно купиь

Vitaly
07.05.2018
14:10:15
:D

Артем
07.05.2018
14:10:34
я не придумал, я разбираю этот звездолёт
group_by: [
n.action,
n.source_user_id,
fragment("round(extract(epoch from ?) / ?)", n.happened_at, @interval)
],
вот это мне нравится особо

Vitaly
07.05.2018
14:12:23
а че не так?
round(extract(epoch from ?) / ?) - это конечно можно лучше написать скорее всего

Артем
07.05.2018
14:13:50
а лучше удалить

Dmitry
07.05.2018
14:13:59
на самом деле там запрос в целом не очень

Google

Dmitry
07.05.2018
14:14:11
но это не значит что разбиение на контексты - зло

Vitaly
07.05.2018
14:14:16
но в целом, если интервал любой может быть любой - то норм
в постгресе на такое можно индекс повесить
и будет норм, возможно

Артем
07.05.2018
14:15:09
разумный подход нужен ко всему

Vitaly
07.05.2018
14:17:51
это да

Alexander
07.05.2018
14:18:24
люблю такие запросы писать в миграциях данных :))) особенно cte и рекурсии

Vitaly
07.05.2018
14:18:54
миграции зачастую одноразовый код же
особенно миграции данных

Артем
07.05.2018
14:19:47
Ммм, миграция данных завернутая в транзакцию
Каеф

Alexander
07.05.2018
14:20:28
ага, сочные запросики мммм

Артем
07.05.2018
14:20:32
Если что не так постгрес всегда откатит пара гигов))
Ну или десятков

MrFlorius
07.05.2018
14:22:58
Глупый вопрос, наверное. Но все же. nif-ы же могут паралельно работать?

Alex
07.05.2018
14:24:11
вроде не запрещено поднимать свой тред пул из инициализации нифа, но это не точно