【问题标题】:Select Attributes From Rails Nested Includes Association With ActiveModelSerializer?从嵌套的 Rails 中选择属性包括与 ActiveModelSerializer 的关联?
【发布时间】:2020-03-20 23:10:05
【问题描述】:

所以我已经为此苦苦挣扎了几个小时,希望有人能提供帮助。

我有 3 级关系,列表、页面和应用程序。
列表 has_many Pages 一个 Page belongs_to List 并且可以选择 belongs_to 一个 App。 应用 has_many Pages

这样的查询

@account.lists.includes(pages: :app)

一切正常,我没有 N+1 个查询,并且所有这些都被正确加载

例如

List Load (3.0ms)  SELECT `lists`.* FROM `rotations` WHERE `lists`.`account_id` = 1
Page Load (2.5ms)  SELECT `pages`.* FROM `pages` WHERE `pages`.`list_id` IN (13, 17, 18)
App Load (2.0ms)  SELECT `apps`.* FROM `apps` WHERE `apps`.`id` IN (6, 9, 15)

我的问题是所有这些语句都是SELECT * FROM,尽管特别是应用程序记录非常重。一个名为“内容”的列中可以有整个 HTML 文档

我真的只需要SELECT apps.id, apps.name FROMapps ....`。所以我没有将这些完整的对象加载到内存中,只是稍后我只渲染 ID 和名称时将其全部丢弃。

我会手动执行此操作,尽管我似乎无法使用 ActiveModelSerializers 进行此操作。

我的序列化器非常标准。一个拥有_many :pages 的列表和一个属于_to :app 的页面。

如何仅从我的嵌套关联之一中提取选择属性?我很确定我可以使用joins(),但我不确定它如何与我的序列化程序一起使用?

干杯

【问题讨论】:

    标签: ruby-on-rails ruby active-model-serializers


    【解决方案1】:

    嗯.. 尝试在具有类似关联的应用上进行测试。我认为这样的事情可能会奏效:

    @account.lists.includes(pages: :app).pluck("apps.id", "apps.name")
    

    这将对关联进行 LEFT OUTER JOIN。

    @account.lists.joins(pages: :app).pluck("apps.id", "apps.name")
    

    会做 INNER JOINS。如果没有关于您的数据结构和示例输出的更多信息,不确定您正在寻找什么。

    【讨论】:

    • 感谢您的回复,这样就可以了,但是我必须为所有表指定每个字段,尽管那时我的 ActiveModelSerializer 不起作用,它无法识别对象。你知道有什么方法可以让它发挥作用吗?
    • 似乎在拔出所有东西时,物体又平了回来。就像没有嵌套一样,这可能是 AMS 在尝试渲染关系时中断的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多