現在Ruby on Railsを利用して、Facebookのようなアプリケーションを作成しております。
Facebookのようなウォールに投稿し、友達が見ることが出来るという構造になっています。
そこで、ある特定の友達(複数可)を除いた人のみに対して、投稿するという機能を実装したいと思っています。
一つひとつの投稿に対して公開範囲が設定してあるという状況をどのように実現するのか、というのが検討もつかなかったので、ぜひお力を貸しいただきたいです。
データ構造
ユーザー
- id
- name
友達
FriendRelationship
- id
- user_id
- friend_user_id
投稿
- id
- user_id
- content
実現したいイメージ
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
CREATE DATABASE hoge; use hoge; CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) COMMENT='ユーザ'; CREATE TABLE `posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `title` varchar(255) NOT NULL, CONSTRAINT `fk_posts_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), PRIMARY KEY (`id`) ) COMMENT='記事'; CREATE TABLE `friend_relations` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `friend_user_id` int(11) NOT NULL, UNIQUE KEY `uidx_friend_relations` (`user_id`,`friend_user_id`), CONSTRAINT `fk_friend_relations_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), CONSTRAINT `fk_friend_relations_friend_user_id` FOREIGN KEY (`friend_user_id`) REFERENCES `users` (`id`), PRIMARY KEY (`id`) ) COMMENT='友人関係'; CREATE TABLE `limited_disclosures` ( `id` int(11) NOT NULL AUTO_INCREMENT, `post_id` int(11) NOT NULL, `user_id` int(11) NOT NULL, UNIQUE KEY `uidx_friend_relations` (`post_id`,`user_id`), CONSTRAINT `fk_limited_disclosures_post_id` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`), CONSTRAINT `fk_limited_disclosures_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), PRIMARY KEY (`id`) ) COMMENT='限定公開設定'; CREATE TABLE `no_disclosures` ( `id` int(11) NOT NULL AUTO_INCREMENT, `post_id` int(11) NOT NULL, `user_id` int(11) NOT NULL, UNIQUE KEY `uidx_friend_relations` (`post_id`,`user_id`), CONSTRAINT `fk_no_disclosures_post_id` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`), CONSTRAINT `fk_no_disclosures_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), PRIMARY KEY (`id`) ) COMMENT='限定公開設定'; INSERT INTO users (name) VALUES ('山田'), ('鈴木'), ('佐藤'), ('John'); INSERT INTO posts (user_id, title) VALUES (1, '山田の全員に見える投稿'), (1, '山田の鈴木にしか見えない投稿'), (1, '山田の鈴木には見えない投稿'), (2, '鈴木の全員に見える投稿'), (2, '鈴木の佐藤にしか見えない投稿'), (2, '鈴木の佐藤には見えない投稿'), (3, '佐藤の全員に見える投稿'), (3, '佐藤の山田にしか見えない投稿'), (3, '佐藤の山田には見えない投稿'), (4, 'Johnの全員に見える投稿'); INSERT INTO friend_relations (user_id, friend_user_id) VALUES (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2); INSERT INTO limited_disclosures (post_id, user_id) VALUES (2, 2), (5, 3), (8, 1); INSERT INTO no_disclosures (post_id, user_id) VALUES (3, 2), (6, 3), (9, 1);
山田の友達の記事を取得するSQLです。
SELECT posts.* FROM posts JOIN friend_relations ON friend_relations.user_id = 1 WHERE posts.user_id = friend_relations.friend_user_id
これに対してlimited_disclosuresとno_disclosuresをLEFT JOIN
SELECT posts.*, limited_disclosures.*, no_disclosures.* FROM posts JOIN friend_relations ON friend_relations.user_id = 1 LEFT JOIN limited_disclosures ON limited_disclosures.post_id = posts.id LEFT JOIN no_disclosures ON no_disclosures.post_id = posts.id WHERE posts.user_id = friend_relations.friend_user_id;
+----+---------+--------------------------------------------+------+---------+---------+------+---------+---------+ | id | user_id | title | id | post_id | user_id | id | post_id | user_id | +----+---------+--------------------------------------------+------+---------+---------+------+---------+---------+ | 4 | 2 | 鈴木の全員に見える投稿 | NULL | NULL | NULL | NULL | NULL | NULL | | 5 | 2 | 鈴木の佐藤にしか見えない投稿 | 2 | 5 | 3 | NULL | NULL | NULL | | 6 | 2 | 鈴木の佐藤には見えない投稿 | NULL | NULL | NULL | 2 | 6 | 3 | | 7 | 3 | 佐藤の全員に見える投稿 | NULL | NULL | NULL | NULL | NULL | NULL | | 8 | 3 | 佐藤の山田にしか見えない投稿 | 3 | 8 | 1 | NULL | NULL | NULL | | 9 | 3 | 佐藤の山田には見えない投稿 | NULL | NULL | NULL | 3 | 9 | 1 | +----+---------+--------------------------------------------+------+---------+---------+------+---------+---------+
ここから絞り込みます
SELECT posts.*, limited_disclosures.*, no_disclosures.* FROM posts JOIN friend_relations ON friend_relations.user_id = 1 LEFT JOIN limited_disclosures ON limited_disclosures.post_id = posts.id LEFT JOIN no_disclosures ON no_disclosures.post_id = posts.id WHERE posts.user_id = friend_relations.friend_user_id AND (limited_disclosures.id IS NULL OR limited_disclosures.user_id = 1) AND (no_disclosures.id IS NULL OR no_disclosures.user_id != 1);
+----+---------+--------------------------------------------+------+---------+---------+------+---------+---------+ | id | user_id | title | id | post_id | user_id | id | post_id | user_id | +----+---------+--------------------------------------------+------+---------+---------+------+---------+---------+ | 4 | 2 | 鈴木の全員に見える投稿 | NULL | NULL | NULL | NULL | NULL | NULL | | 6 | 2 | 鈴木の佐藤には見えない投稿 | NULL | NULL | NULL | 2 | 6 | 3 | | 7 | 3 | 佐藤の全員に見える投稿 | NULL | NULL | NULL | NULL | NULL | NULL | | 8 | 3 | 佐藤の山田にしか見えない投稿 | 3 | 8 | 1 | NULL | NULL | NULL | +----+---------+--------------------------------------------+------+---------+---------+------+---------+---------+
いやあもっといい方法あるのかな。私も知りたいですね。
投稿2016/10/01 17:15
編集2016/10/01 17:20退会済みユーザー
総合スコア0
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/01 23:12
2016/10/02 06:25
退会済みユーザー
2016/10/02 07:22