正确的设计:帖子可以有一个用户(作者)加上许多用户(标记用户)

时间:2011-10-05 11:30:04

标签: ruby-on-rails database-schema rails-models

我有一种情况,我有点卡住了。

帖子可以有用户(作为作者),帖子也可以有很多用户(因为帖子可以标记其他用户)。

在我的帖子模型中:

belongs_to :user
has_and_belongs_to_many :users

在我的用户模型中:

has_and_belongs_to_many :posts

它通常运行良好,但是当我想在我的帖子查询中包含用户时,它会变得相当困难,并按作者的名字对帖子进行排序。

正确的设计应该是什么?也许用Post_id替换post中的user_id?

1 个答案:

答案 0 :(得分:1)

我可以想象UserUsers弄乱你的联接。但请注意,就我的经验而言,这是铁路无法解决的问题。只需将其重命名为author(同时提高可读性/更好地表达意图)将无济于事,因为它仍将指向同一个表users

使用rails进行多次连接时,很难正确表达您的条件。 Rails动态地为你的表创建别名,遗憾的是我找不到在我的条件下解决这些别名的方法。

所以我认为你要么必须使用手工制作的sql(这将是快速的)或使用rails,并首先按照作者名称排序帖子,然后每个帖子秒检索标记用户列表(会更慢,但纯粹的红宝石)。

我会首先选择第二个选项,然后根据需要优化第一个选项。

[更新:添加范围定义]

就个人而言,我不赞成default_scope,而是建议定义一个明确的范围

scope :with_authors_sorted, lambda { 
  Post.includes(:type).includes(:user).
       order('year DESC, week DESC, users.display_name ASC, posts.created_at DESC') 
}

然后您可以在控制器中使用它。

@posts = Post.with_authors_sorted

希望这有帮助。