Ruby on Rails加入表关联

我有一个Ruby on Rails应用程序设置如下:

用户模型

has_and_belongs_to_many :roles 

榜样

 has_many :transactions has_and_belongs_to_many :users 

交易模型

 belongs_to :role 

这意味着使用名为roles_users的连接表,这也意味着用户只能看到通过角色分配给它们的事务,用法示例:

 user = User.find(1) transactions = user.roles.first.transactions 

这将返回与分配给用户的第一个角色关联的事务。 如果用户分配了2个角色,那么为了获得与第二个角色关联的事务,我会这样做:

 transactions = user.roles.last.transactions 

我基本上试图找出一种设置关联的方法,这样我就可以根据用户和角色之间关联中定义的角色通过类似的方式获取用户的事务:

 user = User.find(1) transactions = user.transactions 

我不确定这是否可行? 我希望你明白我想做什么。

如果您不想执行单独的SQL查询来查找每个角色的事务,则可以先为该用户获取role_ids,然后使用单个查询查找具有这些角色ID的所有事务:

 class User < ActiveRecord::Base #... def transactions Transaction.scoped(:conditions => {:role_id => role_ids}) end end 

此处使用Transaction.scoped ,以便您可以在必要时添加更多条件,例如

 user.transactions.all(:limit => 10, :conditions => [ ... ]) 

您可以向User添加一个方法,将每个用户角色的事务收集到一个Array of Arrays中,然后将其展平为一个Array:

 class User < ActiveRecord::Base def transactions user.roles.collect { |role| role.transactions }.flatten end end