Rails 按 HABTM 关系查找记录

Rails find records by HABTM relation

我有两个模型:BlogPost 和 BlogCategory,它们具有 has_and_belongs_to_many 关系。我希望能够显示所有具有特定类别的博客文章,但我不知道该怎么做。我觉得这是一件很常见的事情,所以应该有一些 "rails magic" 的方法来做到这一点,我不必编写复杂的 SQL 查询。我试过这个:

@blog_posts = BlogPost.find(:all, :conditions => ["blog_category.id=?", params[:id]])

但它给了我这个错误:

PG::UndefinedTable: ERROR: missing FROM-clause entry for table "blog_category" LINE 1: SELECT "blog_posts".* FROM "blog_posts" WHERE (blog_categor... ^ : SELECT "blog_posts".* FROM "blog_posts" WHERE (blog_category.id='5')

执行此操作的正确方法是什么?

您正在开发旧的 Rails 应用程序吗?您正在为 ActiveRecord 使用已弃用的表示法(自 Rails 3 以来已有几年历史了)。如果您选中 API,您将找不到条件选项。所以一定要先检查一下。

假设您的人际关系设置正确,这很简单:

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

这就是你需要的:

BlogPost.joins(blog_categories).where(blog_categories: { id: params[:id] })

请注意,如果您需要查找多个类别,可以通过 params[:id] 传递 ids 的数组。