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