2010-05-10 142 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