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

问题描述 投票:0回答:2

我有一个小框架,用于根据前端的 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
2个回答
0
投票

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

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
投票

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

  1. 检查用户是否有_一个地址关联:User.method_defined?(:address)
  2. 检查用户是否有多个地址关联:User.method_defined?(:addresses)

希望这对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.