0

在 Rails 4 中,我有一个项目,其中我设置了三个具有以下多对多关系的模型:

  • 一个物品
    • has_and_belongs_to_many 类别
    • has_and_belongs_to_many 标签
  • 一个类别
    • has_and_belongs_to_many items
  • 一个标签
    • has_and_belongs_to_many items

虽然很容易选择一个项目并自动获取所有关联的类别和标签,但在某些情况下,我想选择项目及其关联的类别,而不是他们的标签。在这些情况下,我想避免对 Tags 表和 ItemsTags 连接表进行额外的数据库连接。任何人都可以帮助我正确查找语法以仅将项目加入类别吗?(旁注:我还计划在项目和其他模型之间添加 10 个额外的多对多关系,但我只是简化了这个问题的场景。最后,我试图避免加入尽可能多的桌子。)

谢谢!

4

1 回答 1

0

默认情况下,Rails 不会加载关联的记录,除非您请求它

Item.all只会从“项目”表中获取记录

然后稍后在您的代码中调用item.categories,这就是执行查询以获取此特定项目的所有类别的时间点。如果您从不调用item.tags,则永远不会执行对“标签”表的查询,并且不会获取记录。底线是:您可以根据需要拥有尽可能多的关联,只要您没有明确调用它们,它们就不会被加载。

关于性能的旁注,rails 提供了几种连接和包含关联表的方法:

Item.include(:category).all将仅触发 2 个查询以获取所有项目和所有相关类别。

Item.include(:category).joins(:category).all-> 将仅触发 1 个查询加入项目和类别表(但它可能比 2 个请求慢)

因此,您可以完全控制从数据库加载的内容。那些也可以申请范围。

于 2013-07-23T00:46:11.417 回答