【问题标题】:Sort by a column in JOIN table of many-to-many relationship (rails)按多对多关系的 JOIN 表中的列排序(rails)
【发布时间】:2016-04-14 23:12:04
【问题描述】:

categorypost 之间存在多对多关系。 连接表是category_post_relationships

class Post < ActiveRecord::Base
    has_many :categories, through: :category_link_relationships
    has_many :category_post_relationships , :dependent => :destroy 
end

class Category < ActiveRecord::Base
    has_many :posts, through: :category_link_relationships
    has_many :category_post_relationships , :dependent => :destroy 
end

class CategoryPostRelationship < ActiveRecord::Base
    belongs_to :post
    belongs_to :category
end

如果我有一个分类,该分类可以查询category.posts的所有帖子。我想通过连接表category_link_relationshipscreated_at 对这些帖子进行排序。每个类别和帖子只能有一个记录。我想按关联关系记录的created_at列对链接进行排序。

例如,帖子 1 已创建并与类别 A 相关联。 然后,帖子 1 与类别 B 相关联。 然后创建帖子 2 并将其关联到类别 B。 B 类现在有帖子 1 和帖子 2。我想按关系的 created_at 而非帖子的 created_at 对帖子 1 和帖子 2 进行排序。

谢谢。

【问题讨论】:

  • 首先你应该使用has_and_belongs_to_many,其次:所以你需要为一个类别按特殊顺序获取所有帖子? @category.posts 之类的东西?
  • 是的。我需要为一个类别按特殊顺序获取所有帖子。特殊顺序取决于该类别与其每个帖子之间关系的created_at
  • 现在您不能将关联更改为 HABTM?
  • 没有。我需要这个连接表。
  • 添加了答案,看看吧

标签: sql ruby-on-rails sorting


【解决方案1】:
class Post < ActiveRecord::Base
    has_many :category_link_relationships , :dependent => :destroy
    has_many :categories, through: :category_link_relationships
end

class Category < ActiveRecord::Base
    has_many :category_link_relationships , :dependent => :destroy
    has_many :posts, through: :category_link_relationships
end

现在您可以通过以下方式找到帖子:

@category.posts.joins(:category_link_relationships).order('category_link_relati‌​onships.created_at')

【讨论】:

  • 对不起。我忘了在我的问题中输入一些内容。我的帖子和分类类的内容和你的一样。
  • 不一样,你忘了through: :category_link_relationships
  • @category.posts.order(:created_at) => 按每个帖子的created_at 排序?我希望它们按帖子与该类别之间关系的created_at 进行排序。例如,创建帖子 1 并关联到类别 A。然后,帖子 1 关联到类别 B。然后创建帖子 2 并关联到类别 B。类别 B 现在有帖子 1 和帖子 2。我想对帖子进行排序1 和帖子 2 由关系的created_at,而不是帖子的created_at
  • 再次抱歉。那是我的错字。
  • 连接表可能有其他列,所以我需要这个表。
【解决方案2】:

如果您总是以这种方式排序,您可以在连接表上使用默认范围。

class CategoryLinkRelationship < ApplicationRecord
  belongs_to :post
  belongs_to :category

  default_scope { order(created_at: :asc)}
end

这将由 ActiveRecord 自动获取。请注意,如果 Category 上还有默认范围,它将覆盖排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多