2010-12-02 12 views
0

私は、ユーザーが自分のトレーニングを追跡できるようにするために、RubyアプリケーションでRubyを構築しました。ユーザーはたくさんのトレーニングをしています。さらに、ユーザーは、ジムの所有者である場合、ボックス(ジム)を作成することができます。目的は、ジムに関連する情報のみを見ることができるようにユーザの活動をフィルタリングすることである。この場合、トレーニング。ボックスショーページでは、メンバーシップを通じてそのボックスに関連付けられているすべてのユーザーを表示し、その結果関連するユーザーのワークアウトを表示したいと思います。ここにセットアップがあります。アソシエーションの問題

ユーザー

class User < ActiveRecord::Base 
    has_many :boxes 
    has_many :workouts, :dependent => :destroy 
end 

ワークアウト

class Workout < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :box 
end 

ボックス

class Box < ActiveRecord::Base 
    belongs_to :user 
    has_many :users, :through => :memberships 
    has_many :workouts, :through => :users 
    has_many :memberships 
end 

会員

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :box 
end 
<% @box.workouts.each do |workout| %> 
    <%= workout.title %><br/> 
    <%= workout.user.username %><br/><br/> 
<% end %> 
エラーを生成しない

...しかし、何もありません:私の/views/boxes/show.html.erbビューでは、私は、次があります。ここにログからの出力があります

Processing BoxesController#show (for 127.0.0.1 at 2010-12-01 22:19:59) [GET] 
    Parameters: {"id"=>"7"} 
    User Load (0.4ms) SELECT * FROM "users" WHERE ("users"."id" = '1') LIMIT 1 
    Box Load (0.3ms) SELECT * FROM "boxes" WHERE ("boxes"."id" = 7) 
    CACHE (0.0ms) SELECT * FROM "boxes" WHERE ("boxes"."id" = 7) 
    User Load (0.4ms) SELECT * FROM "users" WHERE ("users"."id" = 1) 
    Workout Load (0.3ms) SELECT "workouts".* FROM "workouts" INNER JOIN "users" ON "users".id = "workouts".user_id INNER JOIN "boxes" ON "boxes".id = "workouts".box_id WHERE ("workouts"."user_id" = 1) AND ((("workouts"."public" = 1) AND (("users".box_id = 7))) AND (("users".box_id = 7))) ORDER BY created_at DESC 
Rendering template within layouts/application 
Rendering boxes/show 
    User Load (0.6ms) SELECT "users".* FROM "users" INNER JOIN "memberships" ON "users".id = "memberships".user_id WHERE (("memberships".box_id = 7)) 
    Workout Load (0.2ms) SELECT "workouts".* FROM "workouts" INNER JOIN "users" ON "workouts".user_id = "users".id WHERE (("users".box_id = 7)) 
Rendered shared/_navigation (0.6ms) 
Completed in 104ms (View: 23, DB: 2) | 200 OK [http://localhost/boxes/7] 

これはなぜ機能していないのですか?

+0

明らかな質問はありますが、これらのクエリを満たすデータはありますか?また、どのコードが不足していますか、なぜ "ワークアウト"がありますか? "public" = 1'? – Todd

+0

私は2番目の質問でそれに対処するつもりだった。 Workout.rbにはnamed_scopeがあります。ワークアウトは、整数フィールドworkout.publicの選出に基づいてパブリックまたはプライベートのいずれかになります。私はworkout.public == 1でフィルタリングします。私はこれを別の方法で行うべきだったのを知っています。 – bgadoci

答えて

2

私は問題は、ユーザーのボックスメンバーシップの関連付けが、以前に試したことがあるかもしれないものと混ざってしまうことだと思います。あなたは前回のワークアウトを見ればログにロードされているので:条件を示し

Workout Load (0.2ms) 
SELECT "workouts".* 
FROM "workouts" 
INNER JOIN "users" ON "workouts".user_id = "users".id 
WHERE (("users".box_id = 7)) 

ザ・つまり、私はあなたのコードから見ることができませんボックスbelongs_toのユーザー。そしてその行からエラーが出ないので、そのフィールドはデータベースに存在しなければならず、おそらくそれを削除する必要があります。

さらに、ユーザーhas_manyボックスが指定されていますが、メンバーシップであることを追加するのを忘れてしまったようです。

最後に、2つのスルーアソシエーションを組み合わせると、少なくともこの設定では機能しません。あなたが特定のボックス内のユーザーのすべてのワークアウトを取得したい場合は、あなたがこのような何か行うことができます:

#In Controller 
@box_users = @box.users.all(:include => :workouts) 

#In View 
<% @box_users.each do |user| %> 
    <% user.workouts.each do |workout| %> 
    <%= workout.title %> 
    <%= user.username %> 
    <% end %> 
<% end %> 

をへの呼び出し:含まはもちろん必要ではありませんが、代わりに1つのSQLクエリを生成します1+ n

+0

これは素晴らしいことであり、動作しているようです。 1つのフォローアップの質問。 Workout.rbに名前付きスコープがあります: 'named_scope:public_workouts、:conditions => {:public => 1}'。とにかくそれによってトレーニングをフィルターに掛けることはありますか?おそらく '@box_users = @ box.users.all(:include =>:workouts)'を何とか変更していますか? – bgadoci

+0

さて、<%user.workouts.public_workoutsのようにすることができます。それぞれは|運動| %>しかし、それはおそらくすべてのユーザーのためにデータベースを照会する必要があるためインクルードを否定すると思います... – DanneManne

+0

私がここで起こっている唯一の問題は、ワークアウトが正しく応答していないことです:order = > "created_at DESC"のように、全体の代わりに各ユーザの中でそれらを注文するようだ。それは理にかなっていますか? – bgadoci

関連する問題