如何从自定义查询填充ActiveRecord的父关系?

问题描述 投票:0回答:1

所以我有一个包含父设施的 ActiveRecord Schedule,如下所示:

class Schedule < ActiveRecord::Base
  belongs_to :facility, class_name: 'Facility'
  ...
end

在我的应用程序中,我需要根据用户输入动态生成查询 - 而且它们可能会变得相当复杂。然而,我遇到的麻烦应该是来自更熟悉 Rails 内部结构的人。

我正在运行一个查询,我离开加入该设施的位置,如下所示:

   scope = scope.joins("LEFT JOIN facilities AS facility ON facility.id=schedules.facility_id")

   scope = scope.select('TO_JSON(facility.*) facility')

这使得前端代码变得更容易。出于本文的目的,我不会介绍很多现有的架构 - 但我们使用第三方库来生成我们想要在后端处理的查询,并且它不知道如何将查询复数化。数据库名称。我们可以(并且确实)转换请求来解决这个问题 - 但我正在尝试通过使后端变得更聪明(如果可能的话)来改进事情(我们将看看当一切都说了和做了之后,它是否实际上更容易) .

查询按预期执行,结果记录具有

facility
作为属性 (
model.has_attribute?("facility")
=
true
)。

但是,不起作用的是,如果我随后调用

model.facility
- 而不是返回刚刚获取的设施,它想出去运行一个单独的查询来获取父设施实例...

所以,我想知道的是:鉴于我在动态查询中使用像

facility
这样的别名代替
facilities
,我随后如何才能让我的 ActiveRecord 模型实例将该数据用于其父级(或其他)协会?我想集成它,以便这发生在幕后,自动神奇地作为查询反序列化的一部分。谢谢!

ruby-on-rails activerecord
1个回答
0
投票

想通了:)

def Schedule < ActiveRecord::Base
  belongs_to :facility, class_name: 'Facility'

  after_initialize do |model|
    # Deserialize the facility association retrieved via a dynamic query that uses 'facility' as an alias for the facilities table
    if has_attribute?(:facility)
      attrs = model.attributes.to_h
      model.facility = Facility.new(attrs['facility'])
    end
  end

  ...
end
© www.soinside.com 2019 - 2024. All rights reserved.