Уточнение ассоциации

#ruby-on-rails #ruby #ruby-on-rails-4 #associations

#ruby-on-rails #ruby #ruby-on-rails-4 #ассоциации

Вопрос:

У меня есть следующие ассоциации

 User - has_many :campaigns
Campaign - has_many :donations
           belongs_to :user
Donation - belongs_to :campaign
 

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

 @campaigns = current_user.campaigns
@total_donations = @campaigns.dontations.sum('donation_amount')
 

но это не так просто, как это, поскольку мне приходится перебирать каждую из кампаний, принадлежащих этому пользователю. Это правильно?

Каков наилучший способ подойти к этому? Будет ли метод scope или instance также лучше?

Ответ №1:

has_many :through Ассоциация должна работать:

 class User < ActiveRecord::Base
  has_many :campaigns
  has_many :donations, through: campaigns
end

current_user.donations.sum(:donation_amount)
 

Комментарии:

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

2. То, что сделал @Stefan, можно сделать с Donation.joins(:campaigns).where(campaings: { user_id: <user_id> }).sum(:donation_ammount) помощью . Метод has_many класса позволяет сокращать. 1