所以我有一个包含父设施的 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 模型实例将该数据用于其父级(或其他)协会?我想集成它,以便这发生在幕后,自动神奇地作为查询反序列化的一部分。谢谢!
想通了:)
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