提问人:Ryan Pierce Williams 提问时间:9/22/2023 最后编辑:Ryan Pierce Williams 更新时间:9/23/2023 访问量:54
轨道 6.1 |有没有办法检查哪些关联已加入范围?
Rails 6.1 | Is there a way to check which associations have already been joined to a scope?
问:
我有一个小框架,可以根据来自前端的 json 请求在 rails (v6.1.7.3) 中动态构建查询。随着用例的不断增长,一般管理起来有点麻烦的一件事是,有一种方法可以跟踪哪些关联已经加入到给定的查询范围,以及用于这些关联的别名(如果适用)
是否有内置机制可用于确定是否已加入给定关联?有没有办法确定一个协会的别名?
谢谢!
scope = MyModel.where(...)
...
scope.joins!(:assoc)
...
# how to determine if :assoc has already been joined to scope?
答:
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_values
left_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_values
eager_load_values
preload_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?”来检查是否存在关联。
- 检查用户has_one地址关联: User.method_defined?(:地址)
- 检查用户has_many地址关联: User.method_defined?(:地址)
我希望这对你有所帮助。
评论
1赞
mechnicov
9/22/2023
问题不在于在模型中定义关联。基本上,关联添加的是实例,而不是类方法。要检查是否定义了关联,最好使用反射
评论