检查 ActiveRecord::Relation 是否已包含 JOIN

eud*_*nia 10 postgresql ruby-on-rails

我正在将过滤器(user.type)添加到我的查询/关系中的方法内。

有时,如果在过滤之前选择按用户分组(需要users table在另一个模块中进行内部联接),我会收到错误:

PostgreSQL: PG::DuplicateAlias: ERROR: table name "users" specified more than once

在错误发生之前 JOIN 已在查询中 -

$ pry> relation.to_sql
SELECT \"posts\".* FROM \"posts\"
INNER JOIN users ON users.id = posts.user_id
WHERE \"posts\".\"created_at\" BETWEEN '2019-05-01 00:00:00'
AND '2020-05-01 23:59:59' AND \"users\".\"type\" = 'Guest'"
Run Code Online (Sandbox Code Playgroud)

我想通过检查表是否已连接到我的 ActiveRecord::Relation 对象中来修复它。我补充道:

def join_users
  return relation if /JOIN users/.match? relation.to_sql

  relation.joins('LEFT JOIN users ON users.id = posts.user_id')
end
Run Code Online (Sandbox Code Playgroud)

这个解决方案有效,但我想知道 - 有没有更好的方法来检查 JOIN 是否是内部关系?

Seb*_*lma 7

也许您可以使用joins_values,它没有记录,但它是一个ActiveRecord_Relation公共方法,它返回一个数组,其中包含当前查询(对象)构造所用的表的名称:

Post.joins(:user).joins_values # [:user]
Post.all.joins_values          # []
Run Code Online (Sandbox Code Playgroud)

  • 直到还有一个 `.includes_values` 方法 (2认同)