首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过rails中的关系访问has_many?

问如何通过rails中的关系访问has_many?
EN

Stack Overflow用户
提问于 2022-02-09 18:50:01
回答 3查看 448关注 0票数 1

我如何访问我的相关记录?

代码语言:javascript
复制
class Post < ActiveRecord::Base
has_many :post_categories
has_many :categories, through: :post_categories

class Categories < ActiveRecord::Base
has_many :post_categories
has_many :post, through: :post_categories

class PostCategories < ActiveRecord::Base
belongs_to :post
belongs_to :category

PostCategories表有id、posts_id和categories_id列。

代码语言:javascript
复制
id | posts_id | categories_id
1. | 2       | 3
2. | 2       | 4

我想要的是:得到一个类别相关的帖子。比如: all Posts where in x category。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-09 19:52:59

是的,这很简单。

代码语言:javascript
复制
one_or_more_categories = # Category.find... or Category.where...
posts = Post.joins(:categories).where(category: one_or_more_categories)

Rails非常聪明,可以采用模型或查询来查找某些数据,并将其转化为有效的适当查询,这可能是一个子查询。在Rails控制台(Rails console,bundle exec rails c)中进行尝试是查看生成的SQL并更好地了解所发生的事情的好方法。

(编辑:正如另一个答案所指出的,如果您已经检索了特定的类别实例,那么您只需引用category.posts并直接处理该关系,包括.order、.limit等中的链接)。

另一种写“低级”的方法是:

代码语言:javascript
复制
Post.joins(:categories).where(category: {id: one_or_more_category_ids})

当给定一个...which模型实例或ActiveRecord::关系时,ActiveRecord本质上就是Rails在幕后所要做的事情。如果您已经知道了例如类别"name",或者您可以搜索的其他索引文本列,那么您可以相应地调整上面的内容:

代码语言:javascript
复制
Post.joins(:categories).where(category: {name: name_of_category})

joins和where采用哈希模式,其中将联接表名称用作键,其值嵌套在Hash下面,这种模式可以根据您的需要(例如,如果类别有--许多子类别),并且您可以在Rails指南或适当的web搜索中找到关于这一点的更多信息。唯一的缺点是曲折的单数/复数,Rails用它来尝试使事物变得更“英语”,但有时--就像在这种情况下--只是产生了一个额外的认知负担,需要记住哪些部分应该是单数,哪些是复数。

票数 1
EN

Stack Overflow用户

发布于 2022-02-09 19:48:08

不确定这是否解决了问题,但在ActiveRecord中,您的Post将直接访问Category模型,反之亦然。因此,您可以在变量或实例变量中标识希望发布的类别,并查询@specific_category.posts。如果在控制器中执行此操作,甚至可以在before_action过滤器中完成。如果您在序列化程序中使用它,则没有太大的不同。

还可以在Post模型中创建作用域,并使用活动记录或原始SQL查询特定参数。

您的Category模型也有一个错误。有很多总是复数的,所以它是has_many :posts, through: :post_categories

票数 0
EN

Stack Overflow用户

发布于 2022-02-09 20:39:46

获取类别对象,您可以直接获取相关的帖子。请参阅以下内容

代码语言:javascript
复制
category = Category.find(id)
posts = category.posts

由于您已经配置了has_many_through关系,rails将获取与类别相关的post记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71055122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档