Присоединение сводной таблицы к другой таблице (HABTM объединяет HABTM и ассоциации моделей) - PullRequest
0 голосов
/ 10 июля 2011

Допустим, я создаю движок, который имеет много блогов и много пользователей.Пользователи могут иметь много блогов, и блоги могут иметь много пользователей (пользователи hasAndBelongsToMany блоги).Я бы создал сводную таблицу с именем users_blogs, которая бы выглядела так:

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_blogs.Они будут объединены в сводную таблицу, которая будет выглядеть следующим образом:

id users_blog_id post_id
1  2             1
2  3             1

Итак, ссылаясь на users_blogs, пользователь 1 в блоге 2 сотрудничал с пользователем 2 в блоге 2 для создания поста 1.

Я относительно новичок в MVC, поэтому мне интересно, если A) данные о "роли" в первой таблице находятся там, где они должны быть? И B) Есть ли более правильный способ сделать эту структуру?Фреймворки сделают для меня чудо, я просто хочу убедиться, что это имеет смысл, и у меня есть правильные соглашения об именах.Я использую Cakephp, но я также думаю, что на этот вопрос может ответить программист Rails.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 июля 2011

Похоже, вы на правильном пути.Если я вас понимаю, это так и должно быть:

Я не совсем понял одно из ваших утверждений, поэтому я исхожу из предположения, что post belongsTo один blogкак и большинство.

Первая проблема заключается в том, что соглашение об именовании в вашей "сводной таблице" должно быть в алфавитном порядке - поэтому оно должно быть blogs_users, а не 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 голосов
/ 10 июля 2011

Я не знаю о Cakephp, но у вас есть три проблемы с таблицей соединений, которые нарушат отношения habtm в Rails.

1) По умолчанию таблица соединения называется blogs_users. 2) Таблица соединения не должна иметь никаких других атрибутов, таких как role. 3) Таблица соединения не должна иметь id.

Таким образом, ваша таблица blogs_users должна иметь только blog_id и user_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 голосов
/ 10 июля 2011

На самом деле это не вопрос rails, cakephp или mvc, но ваша схема реляционной базы данных выглядит так, как и должна, основываясь на том, что вы описали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...