我如何访问我的相关记录?
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 :categoryPostCategories表有id、posts_id和categories_id列。
id | posts_id | categories_id
1. | 2 | 3
2. | 2 | 4我想要的是:得到一个类别相关的帖子。比如: all Posts where in x category。
发布于 2022-02-09 19:52:59
是的,这很简单。
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等中的链接)。
另一种写“低级”的方法是:
Post.joins(:categories).where(category: {id: one_or_more_category_ids})当给定一个...which模型实例或ActiveRecord::关系时,ActiveRecord本质上就是Rails在幕后所要做的事情。如果您已经知道了例如类别"name",或者您可以搜索的其他索引文本列,那么您可以相应地调整上面的内容:
Post.joins(:categories).where(category: {name: name_of_category})joins和where采用哈希模式,其中将联接表名称用作键,其值嵌套在Hash下面,这种模式可以根据您的需要(例如,如果类别有--许多子类别),并且您可以在Rails指南或适当的web搜索中找到关于这一点的更多信息。唯一的缺点是曲折的单数/复数,Rails用它来尝试使事物变得更“英语”,但有时--就像在这种情况下--只是产生了一个额外的认知负担,需要记住哪些部分应该是单数,哪些是复数。
发布于 2022-02-09 19:48:08
不确定这是否解决了问题,但在ActiveRecord中,您的Post将直接访问Category模型,反之亦然。因此,您可以在变量或实例变量中标识希望发布的类别,并查询@specific_category.posts。如果在控制器中执行此操作,甚至可以在before_action过滤器中完成。如果您在序列化程序中使用它,则没有太大的不同。
还可以在Post模型中创建作用域,并使用活动记录或原始SQL查询特定参数。
您的Category模型也有一个错误。有很多总是复数的,所以它是has_many :posts, through: :post_categories
发布于 2022-02-09 20:39:46
获取类别对象,您可以直接获取相关的帖子。请参阅以下内容
category = Category.find(id)
posts = category.posts由于您已经配置了has_many_through关系,rails将获取与类别相关的post记录。
https://stackoverflow.com/questions/71055122
复制相似问题