我有一种情况,我有点卡住了。
帖子可以有用户(作为作者),帖子也可以有很多用户(因为帖子可以标记其他用户)。
在我的帖子模型中:
belongs_to :user
has_and_belongs_to_many :users
在我的用户模型中:
has_and_belongs_to_many :posts
它通常运行良好,但是当我想在我的帖子查询中包含用户时,它会变得相当困难,并按作者的名字对帖子进行排序。
正确的设计应该是什么?也许用Post_id替换post中的user_id?
答案 0 :(得分:1)
我可以想象User
和Users
弄乱你的联接。但请注意,就我的经验而言,这是铁路无法解决的问题。只需将其重命名为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
希望这有帮助。