Поиск объекта в БД и добавление дополнительного параметра из другой таблицы в ActiveRecord - PullRequest
0 голосов
/ 17 июня 2019

В моей базе данных есть две таблицы: accounts и transactions. Они выглядят примерно так с соответствующими столбцами и примерами записей:

accounts

id |     uid     |
------------------
 1 |   "abcde"   |
 2 |   "qwert"   | 
transactions

id | account_id | amount | balance | 
------------------------------------
 1 | 1          | 100    | 100     |
 2 | 1          | 200    | 300     |
 3 | 2          | 500    | 500     |
 4 | 2          | 300    | 800     | 

Таким образом, в основном на Счете есть много Транзакций, и транзакция сообщает, какая сумма была +, она показывает баланс после добавления этой транзакции к предыдущему балансу. Итак, последняя транзакция сообщает нам, каков текущий баланс на счете.

Теперь я хотел бы получить учетную запись, имеющую только его uid, но с поворотом - я также хотел бы получить остаток, который будет столбцом balance последней транзакции (на основе id), которая принадлежит этому аккаунту. В идеале это даст мне объект модели Account с дополнительным параметром баланса, доступным с помощью object[:balance].

Я знаю, что для этого потребуется левое внешнее соединение и выбор, который добавляет параметр баланса к объекту, что-то вроде select('accounts.*', 'transactions.balance as balance') - плюс выбор последнего, так что упорядочение по идентификатору и ограничение до 1 - но у меня есть не знаю, как создать этот запрос (используя методы activerecord или чистый SQL), учитывая тот факт, что у меня есть доступ только к uid учетной записи, а не к ее id, которая упоминается как account_id.

1 Ответ

0 голосов
/ 17 июня 2019

Вы можете попробовать что-то вроде этого:

WITH ranked AS (
  SELECT t.*, ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY id DESC) AS tr
  FROM transactions AS t inner join accounts a on a.id = t.id
  where a.uid = 'qwert'
)
SELECT * FROM ranked WHERE tr = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...