Rails3: есть ли способ инициализировать модель с дополнительными столбцами (вычисленными / агрегированными), возвращенными из запроса? - PullRequest
0 голосов
/ 01 ноября 2010

СИТУАЦИЯ

Итак, вот упрощенная версия моей ситуации:

У меня есть модель оплаты.Он имеет следующие атрибуты:

  • Сумма платежа
  • Дата платежа

У меня есть модель транзакции.Имеет следующие атрибуты:

  • Описание транзакции
  • Сумма транзакции
  • Идентификатор платежа

ПРИМЕЧАНИЯ:

  • Платеж может быть применен к нескольким транзакциям (т. Е. Платеж has_many транзакций).
  • Остаток платежа может быть рассчитан путем суммирования сумм транзакций каждой транзакции, принадлежащей платежу.

В настоящее время я рассчитываю остаток средств с помощью SQL-соединения, группировки и функции суммирования.Для этого я добавил область действия в свою модель платежей:

scope :all_with_balances, 
  select("payments.*, (payments.payment_amount - sum(transactions.transaction_amount) as remaining_balance").
  joins("LEFT JOIN transactions ON payments.id = transactions.payment_id").
  group(<list of payments columns>)

Здесь важно отметить дополнительный столбец, remaining_balance, возвращаемый этим запросом, который рассчитывается следующим образом: (payments.payment_amount - sum(transactions.transaction_amount) as remaining_balance.

ПРОБЛЕМА

Используя эту область, модели платежей создаются / инициализируются очень хорошо со всеми атрибутами, которые сопоставляются с фактическими столбцами базы данных.Однако я также хотел бы, чтобы они были инициализированы значением remaining_balance. Возможно ли это?

Я думал, что смогу сделать это, определив метод доступа для этого столбца, но он не сработал.

attr_accessor :remaining_balance

1 Ответ

1 голос
/ 01 ноября 2010

ActiveRecord должен прикреплять атрибуты для всех столбцов, включая вычисляемые, к экземплярам платежей в наборе результатов при вызове именованной области действия:

payments = Payment.all_with_balances
balance = payments.first.remaining_balance # should be the value of the aggregate column

Это не работает?

...