如何在Rails中连接三个表?

时间:2014-12-25 22:00:31

标签: sql ruby-on-rails ruby-on-rails-3 join database-design

我的记录设置如下

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(:plan).joins(:role).where(&#34; roles.name =?&#34;,&#39; Gold&#39;)

但这种做法并不奏效。任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:1)

如果您正在尝试查找给定角色的所有订阅,为什么不从角色开始?如果我们正确配置它们,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

答案 1 :(得分:1)

如果您有正确的关联,请使用此:

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