如何知道在处理单个记录时是否进行了“包含”调用?

jgomo3

动机

这样做的动机是,我想嵌入关系链中包含的任何模型的序列化。我所做的工作在关系级别起作用,但是如果获得一条记录,则序列化将无法利用我所做的工作。

到目前为止我取得的成就

基本上,我正在使用includes_valuesclass的方法该方法ActiveRecord::Relation仅告诉我到目前为止已包括了哪些内容。

> Appointment.includes(:patient).includes(:slot).includes_values
=> [:patient, :slot]

为了利用这一点,我使用此初始化程序as_json在该ActiveRecord::Relation级别覆盖该方法

# config/initializers/active_record_patches.rb
module ActiveRecord
  class Relation
    def as_json(**options)
      super(options.merge(include: includes_values)) # I could precondition this behaviour with a config
    end
  end
end

它的作用是增加对我的选择includeas_json关系的方法。

因此,旧的链条:

Appointment.includes(:patient).includes(:slot).as_json(include: [:patient, :slot])

现在可以写,没有最后一个包含:

Appointment.includes(:patient).includes(:slot).as_json

获得相同的结果(PatientandSlot模型嵌入在生成的哈希中)。

问题

问题在于,因为该方法includes_values属于类ActiveRecord::Relation,所以我无法在记录级别使用它来知道是否includes已完成调用

因此,当前,当我从此类查询获取记录并对其进行调用as_json时,我没有得到嵌入式模型。

而实际的问题是回答:

考虑到发生了什么,如何知道查询链中包含的检索当前记录的模型?

如果我可以回答这个问题,那么我可以使用以下as_json方法在自己的模型中覆盖该方法:

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  extend Associations

  def as_json(**options)
    super(options.merge(include: included_models_in_the_query_that_retrieved_me_as_a_record))
  end
end

一个想法

我的一个主意是覆盖includes某个地方(可以在我的初始化程序中直接覆盖ActiveRecord::Relation该类或我的ApplicationRecord类)。但是,一旦到达那里,就找不到在该关系产生的记录中“盖章”任意信息的简便方法。

3limin4t0r

这种解决方案感觉很笨拙,可能还有更好的选择。

class ApplicationRecord < ActiveRecord::Base
  def as_json(**options)
    loaded_associations = _reflections.each_value
      .select { |reflection| association(reflection.name).loaded? }
      .map(&:name)

    super(options.merge(include: loaded_associations))
  end
end

请注意,这仅加载第一级关联。如果是这样的Appointment.includes(patient: :person)话,:patient由于:person嵌套,只会返回如果您打算使事物递归,请提防循环加载的关联。

值得指出的是,您当前正在合并include: ...提供的选项。不允许用户选择使用其他包含选项。我建议reverse_merge改为使用或在左右交换展示位置{includes: ...}.merge(options)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何知道/ etc / shadow中的密码是否用SHA或MD进行了哈希处理?

来自分类Dev

函数可以知道它们是否已经在Python(joblib)中进行了多进程处理

来自分类Dev

Linux内核如何知道哪个进程进行了系统调用?

来自分类Dev

如何知道用户是否在Appstore上对应用程序进行了评级

来自分类Dev

如何知道Jenkins是否在CentOS 7上进行了修补

来自分类Dev

如何使用JavaScript检查是否对服务器进行了调用

来自分类Dev

如何确定是否对异常进行了编译时检查或运行时检查?

来自分类Dev

如何检查用户是否在24小时滑轨之前进行了投票4

来自分类Dev

如何知道用户是否通过 firebase 的第一个请求进行了身份验证

来自分类Dev

如何确定Swift是否使用优化进行了编译

来自分类Dev

如何检查是否在DataGridView中进行了任何更改

来自分类Dev

如何确定卫星是否进行了机动?

来自分类Dev

如何检查rsync是否对bash进行了任何更改?

来自分类Dev

我想知道我们是否确实进行了最后5笔交易

来自分类Dev

是否对BNF进行了参数修改

来自分类Dev

是否无法确定函数是否是生成器函数(如果已对.bind()进行了调用)?

来自分类Dev

如何知道对UITableView的标头部分进行了点击?

来自分类Dev

GitHub 如何知道我在本地存储库中进行了哪些提交?

来自分类Dev

是否对exception :: what()的异常描述进行了标准异常处理?

来自分类Dev

“ using”关键字是否表示已处置对象并进行了GC处理?

来自分类Dev

Visual Studio是否针对超线程微处理器进行了优化?

来自分类Dev

VBA是否通过未知代理对“ HTTP GET”请求进行了处理?

来自分类Dev

ML系列编译器是否对尾部调用进行了任何复杂的优化?

来自分类Dev

进行了错误编辑,如何返回?

来自分类Dev

在处理POST请求时找出谁在Node上通过basicAuth进行了身份验证

来自分类Dev

R:如何以1/10的成功率反复模拟成功之前进行了多少次尝试?(并记录进行了多少次尝试?)

来自分类Dev

是否可以安全地假设,如果我对async_read进行了两次调用,则仅在处理完第一个调用之后才处理第二个调用?

来自分类Dev

如何判断PDO是否找到与我的UPDATE查询匹配的对象,并进行了更新?

来自分类Dev

如何检测Chrome中的JavaScript是否对HTML视频进行了DRM保护?

Related 相关文章

  1. 1

    如何知道/ etc / shadow中的密码是否用SHA或MD进行了哈希处理?

  2. 2

    函数可以知道它们是否已经在Python(joblib)中进行了多进程处理

  3. 3

    Linux内核如何知道哪个进程进行了系统调用?

  4. 4

    如何知道用户是否在Appstore上对应用程序进行了评级

  5. 5

    如何知道Jenkins是否在CentOS 7上进行了修补

  6. 6

    如何使用JavaScript检查是否对服务器进行了调用

  7. 7

    如何确定是否对异常进行了编译时检查或运行时检查?

  8. 8

    如何检查用户是否在24小时滑轨之前进行了投票4

  9. 9

    如何知道用户是否通过 firebase 的第一个请求进行了身份验证

  10. 10

    如何确定Swift是否使用优化进行了编译

  11. 11

    如何检查是否在DataGridView中进行了任何更改

  12. 12

    如何确定卫星是否进行了机动?

  13. 13

    如何检查rsync是否对bash进行了任何更改?

  14. 14

    我想知道我们是否确实进行了最后5笔交易

  15. 15

    是否对BNF进行了参数修改

  16. 16

    是否无法确定函数是否是生成器函数(如果已对.bind()进行了调用)?

  17. 17

    如何知道对UITableView的标头部分进行了点击?

  18. 18

    GitHub 如何知道我在本地存储库中进行了哪些提交?

  19. 19

    是否对exception :: what()的异常描述进行了标准异常处理?

  20. 20

    “ using”关键字是否表示已处置对象并进行了GC处理?

  21. 21

    Visual Studio是否针对超线程微处理器进行了优化?

  22. 22

    VBA是否通过未知代理对“ HTTP GET”请求进行了处理?

  23. 23

    ML系列编译器是否对尾部调用进行了任何复杂的优化?

  24. 24

    进行了错误编辑,如何返回?

  25. 25

    在处理POST请求时找出谁在Node上通过basicAuth进行了身份验证

  26. 26

    R:如何以1/10的成功率反复模拟成功之前进行了多少次尝试?(并记录进行了多少次尝试?)

  27. 27

    是否可以安全地假设,如果我对async_read进行了两次调用,则仅在处理完第一个调用之后才处理第二个调用?

  28. 28

    如何判断PDO是否找到与我的UPDATE查询匹配的对象,并进行了更新?

  29. 29

    如何检测Chrome中的JavaScript是否对HTML视频进行了DRM保护?

热门标签

归档