1

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

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

在我的 Post 模型中:

belongs_to :user
has_and_belongs_to_many :users

在我的用户模型中:

has_and_belongs_to_many :posts

它通常可以正常工作,但是当我想在我的帖子查询中包含用户并按作者姓名对帖子进行排序时,它就会陷入困境。

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

4

1 回答 1

1

我可以想象UserUsers弄乱你的加入。但是请注意,就我的经验而言,这是 Rails 无法很好解决的问题。只是重命名它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

希望这可以帮助。

于 2011-10-05T13:14:57.103 回答