2012-03-18 112 views
1

這大致就是我:Ruby的新手活動記錄查詢/模型關聯

我有很多企業已經通過角色很多用戶:

class Company < ActiveRecord::Base 
    has_many :roles, :dependent => :destroy 
    has_many :users, :through => :roles 
end 

和許多用戶可必須通過許多公司角色:結合兩者結合起來

class User < ActiveRecord::Base 
    has_many :roles, :dependent => :destroy 
    has_many :comapnies, :through => :roles 
end 

和許多角色:

class Role < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :company 
end 

這裏的想法是,用戶可以通過普通的電子郵件用戶名登錄,然後爲每家公司分配特權。角色有一個user_id和company_id鍵以及一個特權列'user_role'(即guest,user,admin等)。

這裏是ruby-newbie讓我失敗的地方。當我的用戶登錄時,我想查詢他們有權訪問哪些公司,並使用菜單下拉菜單即時切換。所以他們登錄並在'A公司'中活躍,然後他們可以切換到'公司B'。當他們切換company_id存儲在一個會話變量(我已經有了他們的user_id存儲與運作的認證系統)。

什麼是最好的查詢方式?我有一個user_id,我想檢索company_id,company_name,'user_role'等列表,然後使用它來生成一個彈出式列表。

我一直在玩控臺嘗試Role.Company.etc.etc,但似乎無法弄清楚這一點。當我在PHP/MySQL中這樣做之前,它將是一個複雜的連接查詢。我相信在Rails中我更容易使用它我似乎無法想象它。 任何幫助,將不勝感激。

感謝,

+0

難道你不能做一些像'在current_user.companies'中的公司做一個列表。爲了測試你是否正確地處理了作用域,你可以在'<如果current_user? %>''<%= current_user.companies%>'<% end %>'在您的某個視圖中 – kobaltz 2012-03-18 20:47:20

+0

這當然假設您的身份驗證在登錄時使用current_user。 – kobaltz 2012-03-18 20:48:05

+0

@kobaltz在視圖中觸發SQL查詢是一種糟糕的形式,所以也許會更好地展示如何在操作中檢索公司。 – coreyward 2012-03-18 20:52:34

回答

0

你可以得到所有用戶必須通過current_user.companies.uniq訪問(任何角色)的企業。 uniq部分只是確保您在列表中沒有重複的公司(在用戶對單個公司有多個角色的情況下)。

+0

好的...我現在明白了。我運行控制檯並設置current_user'current_user = User.find(1)',然後運行'current_user.companies',並獲得我正在尋找的內容。我其中一個模型關係中的「公司」拼寫錯誤,這是問題的一半。 – 2012-03-19 03:28:26

+0

現在......我的問題是如何將角色添加到結果中。例如'公司A:訪客,公司B:管理員等'。我通過一個for循環來運行我的'current_user.companies'結果來做一個簡單的列表,但似乎無法弄清楚第二部分。 – 2012-03-20 03:23:50

+1

'@companies = @ user.companies.include(:roles)'then '@companies.each {| company | 「#{company.name}」#{company.role.name}「} - 然而,這開始違反了德米特法(谷歌它),所以你會想開始重構一些東西,比如'company.role。通過委託(在公司模型中):'委託:名稱,:到=>:角色,:前綴=>:角色',將'name'到'company.role_name'。 – coreyward 2012-03-20 19:18:55

0

感謝大家的反饋。這讓我看着包含和再次加入。最後我看着http://railscasts.com/episodes/181-include-vs-joins和Rails API文檔和拼湊的:

Role.includes(:company).where(:user_id => session[:user_id])

我然後依次通過@Role,我可以拉role.role_name和role.company.name等開始與查詢User.find(session [:user_id])使它變得複雜。