轨道 6.1 |有没有办法检查哪些关联已加入范围?

Rails 6.1 | Is there a way to check which associations have already been joined to a scope?

提问人:Ryan Pierce Williams 提问时间:9/22/2023 最后编辑:Ryan Pierce Williams 更新时间:9/23/2023 访问量:54

问:

我有一个小框架,可以根据来自前端的 json 请求在 rails (v6.1.7.3) 中动态构建查询。随着用例的不断增长,一般管理起来有点麻烦的一件事是,有一种方法可以跟踪哪些关联已经加入到给定的查询范围,以及用于这些关联的别名(如果适用)

是否有内置机制可用于确定是否已加入给定关联?有没有办法确定一个协会的别名?

谢谢!

scope = MyModel.where(...)
...
scope.joins!(:assoc)
...
# how to determine if :assoc has already been joined to scope?
Ruby-on-Rails 轨道 Rails-ActiveRecord Ruby-on-Rails-6.1

评论


答:

1赞 mechnicov 9/22/2023 #1

Rails 为你工作,你不需要检查是否已经使用了某些关联:

self.joins_values |= args

这里使用 Array#| 方法。它返回数组的并集,删除重复项:

ary = [1]
ary |= [1, 2]
ary |= [2, 3]
ary # => [1, 2, 3]

但是你可以用或/和方法检查它。这些方法返回关联数组(符号数组)并按以下方式工作:joins_valuesleft_outer_joins_value

MyModel.joins(:assoc).where(condition).joins_values
# => [:assoc]

MyModel.where(condition).joins_values
# => []

MyModel.left_joins(:assoc).where(condition).left_outer_joins_values
# => [:assoc]

MyModel.where(condition).left_outer_joins_values
# => []

还有 , , 方法:includes_valueseager_load_valuespreload_values

MyModel.includes(:assoc).where(condition).includes_values
# => [:assoc]

MyModel.where(condition).includes_values
# => []

MyModel.eager_load(:assoc).where(condition).eager_load_values
# => [:assoc]

MyModel.where(condition).eager_load_values
# => []

MyModel.preload(:assoc).where(condition).preload_values
# => [:assoc]

MyModel.where(condition).preload_values
# => []

评论

0赞 Ryan Pierce Williams 9/22/2023
正是我需要的 - 谢谢:)
0赞 Eduardo Orestes 9/22/2023 #2

您可以使用“method_defined?”来检查是否存在关联。

  1. 检查用户has_one地址关联: User.method_defined?(:地址)
  2. 检查用户has_many地址关联: User.method_defined?(:地址)

我希望这对你有所帮助。

评论

1赞 mechnicov 9/22/2023
问题不在于在模型中定义关联。基本上,关联添加的是实例,而不是类方法。要检查是否定义了关联,最好使用反射