Ruby ActiveRecord通过关联进行多个连接

时间:2012-07-03 03:37:24

标签: sql ruby-on-rails activerecord join associations

我想转换

SELECT `users`.* FROM `users`
INNER JOIN `memberships`
    ON `memberships`.`user_id` = `users`.`id`
INNER JOIN `roles`
    ON `roles`.`id` = `memberships`.`role_id`
WHERE `memberships`.`group_id` = 'NUCC' AND (expiration > '2012-07-02')
ORDER BY `roles`.`rank` DESC

进入ActiveRecord协会。

群组通过会员资格拥有许多成员(类用户)。每个成员都有一个角色(role_id),它映射到另一个表(角色),然后是AR模型(​​角色)。每个角色都有一个与之相关的等级(整数)。

我想简单地按成员资格 - 角色排名对成员进行排序。

1 个答案:

答案 0 :(得分:2)

未经测试,可能有拼写错误,但是......

class User < ActiveRecord::Base
  has_many :memberships
  has_many :roles, :through => :memberships, :uniq => true
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
end

class Role < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships, :uniq => true
end

然后,按roles.rank:

对用户进行排序
q = User.joins(:memberships => :users)
q = q.where(:memberships.group_id => 'NUCC')
q = q.where("expressionn > '2012-07-02'")
q = q.order("roles.rank DESC")
puts q.to_sql

AREL可让您轻松加入。例如,您可以使用类似于以下语法的INNER JOINS进一步保持这种状态:

User.joins(:memberships => { :users => :someothermodel })

只要记住在需要通过JOIN引用某些内容时复制该结构,或者只是编写自己的SQL片段..