#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