Rails:以嵌套的HABTM关系查找记录

时间:2015-12-06 00:05:59

标签: ruby-on-rails activerecord

我有两个模型:Category和Post,它们通过categories_posts表连接。类别可以通过category_id字段包含子类别,该字段与父类别字段的id相关。 Post可以有多个类别(父类别和子类别,或者只有一个子类别)。

类别:

has_and_belongs_to_many :posts
has_many :categories, class_name: "Category", foreign_key: "category_id"
belongs_to :category, class_name: "Category"

发表:

has_and_belongs_to_many :categories
has_and_belongs_to_many :get_categories, class_name: 'Category'

一切正常,我可以获得一个特定类别的帖子:

Category.find(params[:id]).posts

但无法获得具有自己子类别的类别的帖子,如下所示:

Category.where('`id` = :id OR `category_id` = :id', :id => params[:id]).posts

Rails控制台返回:undefined method 'posts' for #<Category::ActiveRecord_Relation:0x00000110f9be40>

我为此编写了正确的SQL查询,但我需要在ActiveRcord的Rails 4中编写相同的查询。

SELECT DISTINCT posts.* FROM posts INNER JOIN categories_posts ON posts.id = categories_posts.post_id WHERE categories_posts.category_id IN (3,10) ORDER BY posts.date DESC

1 个答案:

答案 0 :(得分:0)

您正在引用属于类别实例数组上的类别实例的帖子关系。如果您想加载帖子,可以添加.includes(:posts)。我不确定你的最终用途是什么,但这就是问题所在。

但是,如果您要加载具有该类别或子类别的所有帖子,请执行Post模型,如下所示:Post.includes(:categories).where('categories.id = :id OR categories.category_id = :id, id: params[:id]).references(:categories)