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

问题描述 投票:1回答:1

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

有时如果在过滤之前选择了用户分组(需要INNER联接到另一个模块中的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'"

我想通过检查表是否已经在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

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

ruby-on-rails postgresql
1个回答
0
投票

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

Post.joins(:user).joins_values # [:user]
Post.all.joins_values          # []
© www.soinside.com 2019 - 2024. All rights reserved.