按多对多关系(rails)的JOIN表中的列排序

时间:2016-01-10 16:45:15

标签: sql ruby-on-rails sorting

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查询所有帖子。我想根据联接表created_at的{​​{1}}对这些帖子进行排序。每个类别和帖子只能有一条记录。我想按相关关系记录的category_link_relationships列对链接进行排序。

例如,创建了帖子1并将其与类别A相关联。 然后,帖子1与B类相关联。 然后创建Post 2并将其与B类关联。 B类现在有帖子1和帖子2.我想按照关系的created_at对帖子1和帖子2进行排序,而不是created_at个帖子。

感谢。

2 个答案:

答案 0 :(得分:1)

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

class CategoryLinkRelationship < ApplicationRecord
  belongs_to :post
  belongs_to :category

  default_scope { order(created_at: :asc)}
end

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

答案 1 :(得分:0)

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')