2010-05-10 141 views
1

我有一个Ruby on Rails应用程序的设置,像这样:Ruby on Rails的连接表关联

用户模型

has_and_belongs_to_many :roles 

角色模型

has_many :transactions 
has_and_belongs_to_many :users 

事务模型

belongs_to :role 

这意味着一个加入t能够使用称为roles_users,同时也意味着用户只能看到已通过角色分配给他们的交易,使用示例:

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

这将返回其与分配给第一角色相关联的交易用户。如果用户分配给他们,此刻2个角色获得与第二角色相关联的交易,我会做:

transactions = user.roles.last.transactions 

我基本上是想办法弄清楚设置关联,所以我可以抢基于用户和角色之间的关联定义的角色通过这样的用户的交易:

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

我不知道这是否可能?我希望你明白我在做什么。

回答

1

如果你不想执行单独的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 => [ ... ]) 
+0

Voyta的答案比我的好。此外,请参阅此博客文章以获取有关使用'scoped'的更多信息:http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality – mikej 2010-05-10 14:51:54

0

你可以添加一个方法Usercollect交易为每个用户的角色到一个数组的数组,然后flatten这一个阵列:

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