2011-07-09 20 views
0

多くのブログと多数のユーザーを持つエンジンを構築しています。ユーザーには多くのブログを持たせることができ、ブログには多くのユーザーを持てる(ユーザーにはブログがあります)。私はこのようになりますと呼ばれるusers_blogsピボットテーブルを作成します。ピボットテーブルを別のテーブルに結合する(HABTMがHABTMとモデルの関連付けに参加する)

id user_id blog_id role 

1 1  1  admin 
2 1  2  poster 
3 2  2  admin 

ので、ユーザ1が1と2をブログに属し、ユーザ2はブログに属し2.ユーザー1は、ブログ1における管理者であり、ブログ2のポスター、ユーザー2はブログ2の管理者です。

投稿があります。 users_blogsには多くの投稿があり、投稿には多くのusers_blogが含まれます。彼らはこのようになります。ピボットテーブルと結合されます:、users_blogsを参照して、だから、

id users_blog_id post_id 
1 2    1 
2 3    1 

ブログ2上のユーザー1私はポスト1.

を作成するために、ブログ2に、ユーザー2と協力MVCには比較的新しいので、最初のテーブルの「ロール」データがどこにあるのかが分かりますか?そしてB)この構造を行う正しい方法がありますか?フレームワークは私のために魔法をやるでしょう、私はちょうどこれが意味をなさないことを確認したい、そして私は正しい命名規則を持っている。私はCakephpを使っていますが、この質問にはRailsプログラマが答えられると思います。

ありがとうございました!

答えて

2

あなたは正しい軌道にいるようです。私はあなたを理解していれば、これはどのようにすべきである:

私は完全にあなたの文のいずれかを理解していなかったので、私はほとんどのようなものpostbelongsTo単一blog前提につもりです。

最初の問題は、「ピボットテーブル」という名前付け規則がアルファベット順である必要があります。つまり、ではなく、users_blogsである必要があります。マイナーだと思うが、そうでなければ動作しない。

協会:

blog hasMany post 
post belongsTo blog 

user hasAndBelongsToMany blog //allowing more than one user to be associated to a blog 
blog hasAndBelongsToMany user 

user hasAndBelongsToMany post //allowing more than one user to be associated to a post 
post hasAndBelongsToMany user 

role hasAndBelongsToMany user //better to keep roles in a table that just a string 
user hasAndBelongsToMany role //use 'with'=>'blogs_users' in your association 
           between user/roll 

テーブル:

users   (id, name, ...etc) 
blogs   (id, title, ...etc) 
roles   (id, role) 
blogs_users  (id, user_id, role_id, blog_id) 
posts   (id, title, blog_id) 
posts_users  (id, post_id, user_id) 

アップデート:私はこの最高の状態ではないよ

- まだ多少自分を学ぶ、しかし - 私の頭の上から離れて、あなたは投稿を得ることができたこのようなものを介してユーザ1が作成したブログ1から:

$blogId = '1'; 
$userId = '1'; 
$posts = $this->Post->find('all', array(
    'conditions' => array(
     'User.id' => $userId, 
     'Blog.id' => $blogId 
    ) 
); 
+0

あなたはアルファベット順のことを正しく理解しており、最初の質問に「ロール」がピボットテーブルに存在する必要があります。 ユーザー1には100個のブログがあります。ブログ1からユーザー1の投稿を取得する場合は、すべてのposts_usersを取得してからすべての投稿を取得し、blog_idとuser_idとを一致させる必要があります。 代わりに、blogs_users_postsテーブルがあればどうなりますか?私たちは、ユーザー1とブログ1を表すblogs_users(blog_user_id)から1つのレコードを取得し、そのblog_user_idでblogs_users_postsのすべての投稿を検索します。これを行うのは上記の方法よりも速いようです。これは正しいですか? ありがとうございます! – MattDiamant

+0

ブログ1からユーザー1の投稿を取得する場合は、ブログIDとuser_idを既に所有していることを前提としています。その特定のブログの投稿を投稿します(投稿テーブルにはblog_idがあります)。 user_id = 1の投稿のみが必要です。たぶん私は何かが欠けているでしょうか? – Dave

+0

私の問題がどこにあるかは分かります。私は、blog_idをusers_postsテーブルに追加するといくらかの価値があると思っていました。 1つのテーブルにuser_idとblog_idがある場合、そのテーブルから出ることなく、そのブログのそのユーザーのすべてのpost_idを見つけることができます。これは本当にブログ内のユーザーの投稿をカウントする場合にのみ役立ちます。 1つのテーブルにuser_idとblog_idの両方がある場合は、それらを組み合わせてusers_blog_idとし、users_blogsを参照してください。これにより、テーブルがusers_postsと同じサイズになり、詳細情報が得られます。私はそれもクエリ時間を節約すると思ったが、そうではない。 – MattDiamant

0

これは実際にはrails、cakephp、またはmvcの質問ではありませんが、リレーショナルデータベースのスキーマは、説明した内容に基づいているはずです。

+0

命名規則が正しい場合、CakeとRubyは多くの "automagic"を行います。私はまた、これらの団体を作るこの方法がベストプラクティスか、これを行う良い方法があるかどうかを尋ねています。 – MattDiamant

0

私は、CakePHPのことは知らないが、あなたについての三つの問題のRailsでHABTMの関係が壊れますテーブルを結合するがあります。

1)デフォルトでは、結合テーブルの名前はblogs_usersです。 2)結合テーブルには、roleのような他の属性は使用できません。 3)結合テーブルにはidが含まれていてはいけません。

あなたのblogs_usersテーブルはblog_iduser_idしか持たないようにしてください。そうしないとエラーが発生します。

Railsで結合テーブルを本格的なモデルにしたい場合は、has_many :throughの関係を使用します。したがって

class User 
    has_many :user_blogs 
    has_many :blogs, :through => :user_blogs 
end 

class UserBlog 
    belongs_to :blog 
    belongs_to :user 

    validates_presence_of :role, :in => ALLOWED_ROLE_NAMES # Example of logic in this model 
end 

class Blog 
    has_many :user_blogs 
    has_many :users, :through => :user_blogs 
end 
+0

彼は彼がCakePHPを使用していると言いましたので、#2)が間違っていて#3)も間違っています – Dave

+0

CakephpはRailsと非常によく似ていると聞きました。もしRailsがあなたにこれをさせてくれないことが本当であり、CakePHPがそうであれば、この質問はRailsの答えには適切ではありません。申し訳ありません。 – MattDiamant

関連する問題