我想转换
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模型(角色)。每个角色都有一个与之相关的等级(整数)。
我想简单地按成员资格 - 角色排名对成员进行排序。
答案 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片段..