Size: a a a

Чат по руби

2021 February 19

КП

Кот Программист... in Чат по руби
lexxx
Знаете что-то за Evrone?
знаю, я же тут работаю
источник

D

Dmitriy in Чат по руби
Кот Программист
знаю, я же тут работаю
😂😂😂
источник

l

lexxx in Чат по руби
Кот Программист
знаю, я же тут работаю
Не слежу, поэтому и уточнил.
источник

КП

Кот Программист... in Чат по руби
lexxx
Не слежу, поэтому и уточнил.
да я чуть выше вроде достаточно однозначно намекнул - на правах текущего места работы - ну да ладно, вопросы есть?
источник

l

lexxx in Чат по руби
Кот Программист
да я чуть выше вроде достаточно однозначно намекнул - на правах текущего места работы - ну да ладно, вопросы есть?
Из того сообщения это неочевидно, слишком витиевато.

Вопросов особо нет.

Можете рассказать сколько лет опыта было за плечами, когда смогли попасть в Evrone. Было бы интересно узнать
источник

КП

Кот Программист... in Чат по руби
lexxx
Из того сообщения это неочевидно, слишком витиевато.

Вопросов особо нет.

Можете рассказать сколько лет опыта было за плечами, когда смогли попасть в Evrone. Было бы интересно узнать
за плечами был один год коммерческого опыта, и 2 года вообщем с момента как я начал изучать ruby в этом чате
источник

КП

Кот Программист... in Чат по руби
можно найти в истории мои сообщения с моими глупыми вопросами
источник

l

lexxx in Чат по руби
Кот Программист
за плечами был один год коммерческого опыта, и 2 года вообщем с момента как я начал изучать ruby в этом чате
Отлично, спасибо за ответ.
Очень вдохновляет, как раз моя история примерно ~ 1.5г опыта
источник

КП

Кот Программист... in Чат по руби
пожалуй заведу тег #рецепты #sql
сегодня была интересная задача, писал запрос в базу на Sequel ORM (аналог ActiveRecord)
Мне нужно было вставить условно 100-10000 записей одним запросом используя одинаковые значения для двух полей, однако в этом же запросе мне нужно было запросить поле id из другой таблицы чтобы вставить его как foreign_key
т.е. есть у меня таблица c пользователями
   Column    |  Type   | Collation | Nullable |      Default      | Storage  | Stats target | Description
-------------+---------+-----------+----------+-------------------+----------+--------------+-------------
id          | uuid    |           | not null | gen_random_uuid() | plain    |              |
name        | text    |           |          |                   | extended |              |
и таблица в которую я хотел вставить данные
    Column    |            Type             | Collation | Nullable |             Default              | Storage  | Stats target | Description
--------------+-----------------------------+-----------+----------+----------------------------------+----------+--------------+-------------
id           | integer                     |           | not null | generated by default as identity | plain    |              |
user_id      | uuid                        |           |          |                                  | plain    |              |
type         | text                        |           | not null |                                  | extended |              |
scheduled_at | timestamp without time zone |           | not null |                                  | plain    |              |
Обычно вам нужно вставить к примеру пару строк и вы это делаете так в ActiveRecord
User.create([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }])
если вам нужны инициализированные объекты в ответ или так
Book.insert_all([
 { id: 1, title: "Rework", author: "David" },
 { id: 1, title: "Eloquent Ruby", author: "Russ" }
])
если нужно просто быстро вставить пару row
однако в случае когда у вас есть для одного поля целый массив, а для других предполагается одно и тоже значение, вы могли бы сбилдить обычный рубиновый массив
ids = [1,2,3]
ids.map { |id| { user_id: id, type: :some_type, scheduled_at: Time.now} }
и потом просто сделать insert_all по примеру выше

Однако в моем случае
1. делать запрос в базу за id
2. потом обрабатывать большую коллекцию
3. делать второй запрос чтобы вставить эту информацию в таблицу
слишком долго!

Нужно как-то сделать insert_all чтобы он заполнял одно и тоже значение в двух колонках

Как оказалось на чистом SQL есть примеры на основе которых и можно подумать как это сделать
sql генерируемый обычным insert_all выглядит вот так
INSERT INTO some_table
(id, sheduled_at, type)
VALUES
(1, '2015-01-01', 3),
(2, '2015-01-01', 3),
(3, '2015-01-01', 3),
(100500, '2015-01-01', 3);
...

в некоторых базах данных есть команда unnest
с её помощью можно написать аналогичный sql код вот так
INSERT INTO some_table 
(id, sheduled_at, type)
SELECT
    unnest(array[100, 110, 153, 100500 ...]), '2015-01-01', 3;
и он будет делать все тоже самое что и пример выше.

Осталось только дело за малым, как написать этот код на ruby)
на ActiveRecord никак, можно с Arel может быть, но я не настолько специалист, в любом случае без вставок SQL не обойдется или усилия по изучению Arel просто не будут того стоить

А на Sequel это будет выглядеть вот так
DB[:some_table].import(
 [
    :user_id,
    :type,
    :sheduled_at
 ],
 DB.select(
         Sequel.function(:unnest,
             User.where(id: [1,5,10...10001,10002].select { array_agg(:id) }
         ),
         "ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА",
         Time.now
       )
)
Где array_agg это функция из Sequel использующая одноименную функцию из базы данных PostgreSQL, она позволяет преобразовать группу значений в массив, в моем случае записать результат запроса id в массив (в массив в представлениях базы данных) , таким образом Sequel сгенерирует SQL в котором будет 3 подзапроса.
источник

КП

Кот Программист... in Чат по руби
полагаю после этого вы можете выглядеть как в этом меме
источник

s

serwet in Чат по руби
источник

s

serwet in Чат по руби
Я слушаю про Active Record
источник

SU

Serg Udo in Чат по руби
Кот Программист
пожалуй заведу тег #рецепты #sql
сегодня была интересная задача, писал запрос в базу на Sequel ORM (аналог ActiveRecord)
Мне нужно было вставить условно 100-10000 записей одним запросом используя одинаковые значения для двух полей, однако в этом же запросе мне нужно было запросить поле id из другой таблицы чтобы вставить его как foreign_key
т.е. есть у меня таблица c пользователями
   Column    |  Type   | Collation | Nullable |      Default      | Storage  | Stats target | Description
-------------+---------+-----------+----------+-------------------+----------+--------------+-------------
id          | uuid    |           | not null | gen_random_uuid() | plain    |              |
name        | text    |           |          |                   | extended |              |
и таблица в которую я хотел вставить данные
    Column    |            Type             | Collation | Nullable |             Default              | Storage  | Stats target | Description
--------------+-----------------------------+-----------+----------+----------------------------------+----------+--------------+-------------
id           | integer                     |           | not null | generated by default as identity | plain    |              |
user_id      | uuid                        |           |          |                                  | plain    |              |
type         | text                        |           | not null |                                  | extended |              |
scheduled_at | timestamp without time zone |           | not null |                                  | plain    |              |
Обычно вам нужно вставить к примеру пару строк и вы это делаете так в ActiveRecord
User.create([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }])
если вам нужны инициализированные объекты в ответ или так
Book.insert_all([
 { id: 1, title: "Rework", author: "David" },
 { id: 1, title: "Eloquent Ruby", author: "Russ" }
])
если нужно просто быстро вставить пару row
однако в случае когда у вас есть для одного поля целый массив, а для других предполагается одно и тоже значение, вы могли бы сбилдить обычный рубиновый массив
ids = [1,2,3]
ids.map { |id| { user_id: id, type: :some_type, scheduled_at: Time.now} }
и потом просто сделать insert_all по примеру выше

Однако в моем случае
1. делать запрос в базу за id
2. потом обрабатывать большую коллекцию
3. делать второй запрос чтобы вставить эту информацию в таблицу
слишком долго!

Нужно как-то сделать insert_all чтобы он заполнял одно и тоже значение в двух колонках

Как оказалось на чистом SQL есть примеры на основе которых и можно подумать как это сделать
sql генерируемый обычным insert_all выглядит вот так
INSERT INTO some_table
(id, sheduled_at, type)
VALUES
(1, '2015-01-01', 3),
(2, '2015-01-01', 3),
(3, '2015-01-01', 3),
(100500, '2015-01-01', 3);
...

в некоторых базах данных есть команда unnest
с её помощью можно написать аналогичный sql код вот так
INSERT INTO some_table 
(id, sheduled_at, type)
SELECT
    unnest(array[100, 110, 153, 100500 ...]), '2015-01-01', 3;
и он будет делать все тоже самое что и пример выше.

Осталось только дело за малым, как написать этот код на ruby)
на ActiveRecord никак, можно с Arel может быть, но я не настолько специалист, в любом случае без вставок SQL не обойдется или усилия по изучению Arel просто не будут того стоить

А на Sequel это будет выглядеть вот так
DB[:some_table].import(
 [
    :user_id,
    :type,
    :sheduled_at
 ],
 DB.select(
         Sequel.function(:unnest,
             User.where(id: [1,5,10...10001,10002].select { array_agg(:id) }
         ),
         "ЗДЕСЬ МОГЛА БЫТЬ ВАША РЕКЛАМА",
         Time.now
       )
)
Где array_agg это функция из Sequel использующая одноименную функцию из базы данных PostgreSQL, она позволяет преобразовать группу значений в массив, в моем случае записать результат запроса id в массив (в массив в представлениях базы данных) , таким образом Sequel сгенерирует SQL в котором будет 3 подзапроса.
Можно узнать, по какой причине выбрали Sequel?
источник

SU

Serg Udo in Чат по руби
Вы его в Рельсе используете?
источник

КП

Кот Программист... in Чат по руби
Serg Udo
Можно узнать, по какой причине выбрали Sequel?
по причине что он потребляем меньше памяти, быстрее работает, и имеет более продвинутые возможности для написания сложных запросов и потому что не используем rails, т.е. у меня пока не было случая когда я не смог бы что-то написать не прибегая к чистому sql.
на второй вопрос- ответ нет
источник

SU

Serg Udo in Чат по руби
Спасибо. Интересный пример.
источник

AS

Alex Sherman in Чат по руби
источник

AS

Alex Sherman in Чат по руби
И охрененный APM (application performance monitor) https://www.skylight.io/
источник

AS

Alex Sherman in Чат по руби
я сейчас ловлю "утечки памяти" в одном приложении - ну типа за сутки контейнер разрастается до офигенных размеров
источник

AS

Alex Sherman in Чат по руби
и душу это добро как раз с помощью этих советов и этого мониторинга, бесплатного для опенсорца

дело в том, что там молодой коллега писал несколько кусков
и в итоге приложение, допустим, два раза на инвойс в индексе лезет в БД за данными, которые можно закешировать или просто вынести в константы - и такого дофига
источник