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

jhiyze9q  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(103)

所以我有一个ActiveRecord Schedule,它有一个父Facility,如下所示:

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')

这使得前端代码更容易。有很多现有的架构,我不会进入这篇文章的目的-但我们使用第三方库,生成我们想要在后端处理的查询,它不知道如何复数化数据库名称。我们可以(并且确实)转换请求来解释这一点-但是我试图通过尽可能使后端更智能来改进事情(我们将看到当所有的都说了和做了之后,它是否真的更容易)。
查询按预期执行,结果记录的属性为facilitymodel.has_attribute?("facility") = true)。
然而,不起作用的是,如果我调用model.facility-而不是返回刚刚获取的设施,它想出去运行一个单独的查询来获取父设施示例。
我想知道的是假设我在动态查询中使用了facility这样的别名来代替facilities,那么我如何才能让我的ActiveRecord模型示例将该数据用于其父(或其他)关联?我想把它集成起来,这样就可以在后台自动地、神奇地作为查询的一部分。谢谢你,谢谢

wbgh16ku

wbgh16ku1#

fixed it out:)

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

相关问题