【问题标题】:Rails many to many API queryRails 多对多 API 查询
【发布时间】:2020-09-08 05:40:33
【问题描述】:

情况

我有以下 3 个模型

class House < ApplicationRecord
  has_many :ownerships
  has_many :people, through: :ownerships
end
class Person < ApplicationRecord
  has_many :ownerships
  has_many :houses, through: :ownerships
end

class Ownership < ApplicationRecord
  belongs_to :house
  belongs_to :person
end

预期结果

基本上,我想以 JSON 格式进行查询,以获取所有 houses 与关联 people 的列表。关键是有些房子没有人,有些人没有房子,所以Ownership 协会没有所有房子的ID。如果房子不属于任何人,则响应应为零。

查询的结果如下:

{
  house1: {
    owners: [
      person1,
      person2
    ]
  },
  house2: {
    owners: null
  },
  house3: {
    owners: [
      person2
    ]
  }
}

我尝试过的

我尝试使用includes,但我得到了没有关联结构的分隔项目数组。

House.all.includes(:people).as_json(include: [:people])

people 值位于单独的键中,并且与houses 无关。

【问题讨论】:

  • 你试过House.all.as_json(include: {ownerships: :person})House.all.preload(:people).as_json(include: {ownerships: :person})。一般来说,我会推荐使用真正的演示者模式,我非常偏爱 grapegrape-entity 进行 API 交互,因为 DSL 非常可重用和灵活

标签: ruby-on-rails ruby many-to-many has-many-through


【解决方案1】:

查询可以如下

House.includes(ownerships: :person).as_json(include: [:people])

这将返回您预期的结果。 在您的包含中,您键入房屋之间的关系 -> 所有权(复数)然后从所有权 -> 人(由于所有权属于单数)

【讨论】:

  • 哦,我刚试过,效果很好!非常感谢。我花了很多时间试图弄清楚。我仍然不太了解包含的语法及其实际工作方式。总而言之,这是纯粹的魔法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多