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

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

谢谢!

scope = MyModel.where(...)
...
scope.joins!(:assoc)
...
# how to determine if :assoc has already been joined to scope?

推荐答案

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_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
# => []

Ruby-on-rails相关问答推荐

DELETE_IF和REJECT的意外行为!方法

带有data-turbo的rails`link_to‘未获得turbo_stream请求格式

Ruby on Rails/Activerecord 排序自引用查询?

在 Ruby on Rails html.erb 文件中循环

如何获取 Rails 表单构建器将为某个字段生成的 HTML名称属性?

NameError:未定义的局部变量或方法记录器

Rails:删除级联与依赖销毁

如何在 routes.rb 中使用 301 或 302 进行重定向

可能在rails中有多态has_one关系?

在 ruby​​ on rails 上构建方法

为什么 respond_with 被从 rails 4.2 移除到它自己的 gem 中?

Rails:使用 gem 卸载特定版本的库

设计自定义路由和登录页面

过滤器在渲染之前但在控制器之后执行?

如何检测导致 Rake 中的弃用警告的原因

redirect_to 和 render 是可交换的吗?

为什么 Google Oauth 在我的 Rails 应用程序中返回无效的 redirect_urI?

如何检测rails是否在根url?

是否可以输出rake db:migrate产生的 SQL 更改脚本?

为什么 Rails 需要 JavaScript 运行时?