我在将过滤器(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是否在内部关系中?
也许您可以使用joins_values
,它没有记录,但是是一个ActiveRecord_Relation
公共方法,它返回一个数组,该数组包含当前查询(对象)使用的表的名称:
Post.joins(:user).joins_values # [:user]
Post.all.joins_values # []