将数据透视表连接到另一个表(HABTM连接HABTM和模型关联)

时间:2011-07-09 22:38:47

标签: mysql ruby-on-rails model-view-controller cakephp model

假设我正在构建一个拥有许多博客和众多用户的引擎。用户可以拥有许多博客,博客可以拥有多个用户(用户拥有AndBelongsToMany博客)。我将创建一个名为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,博客2上的用户1与博客2上的用户2合作创建了帖子1。

我对MVC比较陌生,所以我想知道A)第一个表中的“角色”数据是否应该是它的位置?和B)是否有更正确的方法来构建这个结构?框架将为我带来魔力,我只是想确保这是有道理的,并且我有正确的命名约定。我正在使用Cakephp,但我也认为这个问题可以由Rails程序员来回答。

谢谢!

3 个答案:

答案 0 :(得分:2)

看起来你走在正确的轨道上。如果我理解你,那应该是这样的:

我没有完全理解你的一个陈述,所以我假设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
    )
);

答案 1 :(得分:0)

这不是一个rails,cakephp或mvc问题,但是您的关系数据库架构看起来应该基于您所描述的内容。

答案 2 :(得分: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