【问题标题】:Ruby ActiveRecord multiple joins through associationsRuby ActiveRecord 通过关联进行多个连接
【发布时间】:2012-07-03 11:37:51
【问题描述】:

我想转换

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)。每个角色都有一个与之关联的等级(整数)。

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

【问题讨论】:

  • 注意:'NUCC' 需要来自 Group 模型本身(组的 ID),过期日期为 Date.today

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


【解决方案1】:

未经测试,可能有错别字,但是...

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

然后,按角色排名对用户进行排序:

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 片段。..

【讨论】:

  • 感谢您的回复!我还没有尝试过(我会很快/也许在我发布这个之后),但是我有一个澄清的问题;通过指定 :uniq => true,是否将用户(成员)限制为每个组一个角色?我最终想要扩展的模型是用户可以在组内拥有多个角色。不是超级关键的atm,但如果不难,我想为它留出空间。
  • 将成员限制为一个成员资格(参考)到每个角色。也就是说,它可以保护您免于引用同一个角色两次,即使多个成员资格指向它[无论如何您可能都不想这样做,但是 rails 只会认识到间接重试的“两个”角色实际上是同一件事并且按指示行动。是的,它完全是可选的,具体取决于您的需要。我只是发现 int 对“has_many :thoguht => ...”很有用,并且大部分时间都添加它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多