2017-10-06 4 views

Répondre

1

Comme Nick l'a mentionné, Payment.find(id).subscription.user fonctionnera tout simplement bien. Si c'est quelque chose que vous ferez souvent, je vous recommande d'ajouter une relation has_one :through.

class Payment < ApplicationRecord 
    belongs_to :subscription 
    has_one :user, through: :subscription 
end 

Et vous pouvez référencer directement Payment.find(id).user!

0

Si vous déclarez une association indirecte de paiement à l'utilisateur, vous pouvez l'obtenir directement:

class User < ApplicationRecord 
    has_many :subscriptions 
    has_many :payments, through: :subscriptions 
end 

clas Subscription < ApplicationRecord 
    belongs_to :user 
    has_many :payments 
end 

class Payment < ApplicationRecord 
    belongs_to :subscription 
    has_one :user, through: :subscription 
end 

user = User.joins(:payments).where(payments: { id: [id] }).first 
# or 
payment = Payment.eager_load(:user).find(id) 
user = payment.user