Ruby on Rails: как написать оператор поиска, который суммирует множество значений, если объект принадлежит другому объекту? - PullRequest
0 голосов
/ 20 августа 2010

Допустим, у пользователей есть BankAccounts со значением баланса.

Итак, как мне сгенерировать массив, в котором пользователи и общее значение всех значений их BankAccounts сложены вместе?

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Я не уверен, что это именно то, что вы хотите, но вы можете сделать что-то вроде:

ActiveRecord::Base.connection.select_all("select user_id, sum(balance) from accounts group by user_id;")

Это даст вам массив user_ids и остатки из таблицы счетов. Преимущество такого способа состоит в том, что он сводится только к одному SQL-запросу.

1 голос
/ 20 августа 2010

Вы захотите сделать что-то подобное. Я не верю, что можно использовать #sum через ассоциацию.

class User
  def net_worth
    BankAccount.sum(:balance, :conditions => ["user_id = ?", self.id])
  end
end

Редактировать

Я вижу ссылку на #sum в AssociationCollection , поэтому попробуйте это:

class User
  def net_worth
    self.bank_accounts.sum(:balance)
  end
end

(я не проверял этот код)

0 голосов
/ 20 августа 2010

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

@users = User.all

Затем вам нужно взять массив и собрать его только с теми элементами, которые вы хотите.

@users.collect! {|u| [u.name, u.bank_account_total_value]}

Для этого своего рода атрибута я бы установил его в модели, предполагая, что у вас есть has_many :transactions в качестве ассоциации

Class User

 has_many :transactions 

 def bank_account_total_value
     total = 0
     self.transactions.each do |t|
        total += t.amount
     end 
 end   

end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...