2

我想转换

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),该角色映射到另一个表 (roles),然后是一个 AR 模型 (Role)。每个角色都有一个与之关联的等级(整数)。

我想简单地按会员角色等级对组的成员进行排序。

4

1 回答 1

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

然后,按 role.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 片段。

于 2012-07-03T04:01:27.260 回答