2014-12-25 3 views
2

У меня есть записи, установленные следующим образомКак присоединиться к трем таблицам в Rails?

Subscription: id, plan_id     <- belongs to plan 
Plan: id, role_id       <- belongs to role 
Role: id, name 

Учитывая эти данные

Subscription: id: 1, plan_id: 5 
Plan: id: 5, role_id: 10 
Role: id: 10, name: 'Gold' 

Я пытаюсь написать присоединиться, так что я могу найти подписки на основе связанных с ними ролей, то есть:

Subscription.joins (: план) .joins (: роль) .гд ("roles.name =?", 'Gold')

Но этот подход не работает. Любая помощь будет оценена по достоинству.

Спасибо.

ответ

0

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

gold_role = Role.where(name: 'Gold').first 
gold_role.subscriptions 

Это возможно через Rails' has_many :through relations. Я думаю, что это правильная установка для моделей:

class Subscription < ActiveRecord::Base 
    belongs_to :plan 
    has_one :role, through: :plan 
end 

class Plan < ActiveRecord::Base 
    has_many :subscriptions 
    belongs_to :role 
end 

class Role < ActiveRecord::Base 
    has_many :plans 
    has_many :subscriptions, through: :plans 
end 
0

Если у вас есть собственные ассоциации, то используйте:

Subscription.includes(:plan => [:role]).where("roles.name = 'Gold'").first 

Вы также можете написать запрос вручную:

Subscription.joins("INNER JOIN plans ON plans.id = subscriptions.plan_id 
        INNER JOIN roles ON roles.id = plans.role_id").where("roles.name = 'Gold'").first 
Смежные вопросы