2012-03-18 19 views
1

ここでは、私が持っているものおおよそ次のとおりです。ルビー - 初心者Active Recordのクエリ/モデルの関連

私はロールを介して、多くのユーザーを持っている多くの企業があります。

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

とを通じて多くの企業を持つことができ、多くのユーザーを役割:2一緒に結合し

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_role'(guest、user、adminなど)とともにuser_idとcompany_idの各キーがあります。

ここで、ルビーの初心者は私に失敗します。ユーザーがログインすると、特権を持っている企業を照会し、メニューをドロップダウンしてオンザフライで切り替える必要があります。そこで、彼らはログインし、「会社A」でアクティブであり、次に「会社B」に切り替えることができます。彼らが切り替えるとき、company_idはセッション変数に格納されています(私はすでにuser_idに機能している認証システムが格納されています)。

これを照会する最良の方法は何ですか?私はuser_idを持っていて、company_id、company_name、 'user_role'などのリストを取得したいのですが、これを使ってポップダウンリストを生成します。

私はコンソールで試していますが、Role.Company.etc.etcを試していますが、これを理解できないようです。私がPHP/MySQLでこれをやっていたのは、複雑な結合クエリだったはずです。私はジェットはそれを把握することができないレール私はそれが簡単だと確信しています。 ご協力いただければ幸いです。

おかげで、

ダン

+0

あなたは 'current_user.companies'の会社のために何かをしてリストをすることができませんでしたか?スコープが正しく処理されているかどうかを調べるには、 '<%if current_user? – kobaltz

+0

これはもちろん、ログイン時に認証がcurrent_userを使用していることを前提としています。 – kobaltz

+0

@kobaltzビューでSQLクエリをトリガするのは悪いフォームなので、アクション内の会社を取得する方法を示すだけの方がいいでしょう。 – coreyward

答えて

0

ユーザーがcurrent_user.companies.uniqを経由して(どのロール用)へのアクセス権を持つ企業の全てを取得することができます。 uniqの部分では、リストに重複した会社がないことが保証されます(ユーザーが1つの会社に対して複数の役割を持つ場合)。

+0

オ...私は今それを得る。私はコンソールを実行し、current_user 'current_user = User.find(1)'を設定し、 'current_user.companies'を実行して、私が探していたものを得ました。私は実際には、問題の半分であった私のモデル関係の1つで、「企業」が間違って綴られていました。 –

+0

今、私が持っている質問は、どのようにして結果に役割を加えることができるかということです。例えば、「会社A:ゲスト、会社B:管理者等」とする。私は 'current_user.companies'の結果をforループで実行して単純なリストを作成しますが、この2番目の部分を理解できないようです。 –

+1

'@companies = @ user.companies.include(:roles)'それから '@companies.each {| company | #{company.name} "#{company.name}"}の#{company.role.name} - しかし、これはDemeterの法則(google it)に違反し始めているので、あなたはcompany.roleのようなリファクタリングを始めたいと思うでしょう。 delegate:name、:to:role::prefix =>:role'を使用して、(companyモデルの)delegationを介して 'company.role_name'に' name'を追加します。 – coreyward

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(セッション[:user_id])はそれを複雑にしていました。