[Rails5] Fix snippets_finder arel queries

There is a bug https://github.com/rails/arel/issues/531 in Rails 5.0 and
5.1 in Arel/ActiveRecord.

This commit converts arel based queries to their raw counterparts to
make the finder work in Rails 5.0.

These changes should be reverted when on Rails 5.2 as since that version
such queries work well again. See the bug link.
This commit is contained in:
blackst0ne 2018-06-14 11:20:11 +11:00
parent adb069881a
commit 53ea0f221e
2 changed files with 15 additions and 5 deletions

View File

@ -54,7 +54,10 @@ class SnippetsFinder < UnionFinder
end end
def authorized_snippets def authorized_snippets
Snippet.where(feature_available_projects.or(not_project_related)) # This query was intentionally converted to a raw one to get it work in Rails 5.0.
# In Rails 5.0 and 5.1 there's a bug: https://github.com/rails/arel/issues/531
# Please convert it back when on rails 5.2 as it works again as expected since 5.2.
Snippet.where("#{feature_available_projects} OR #{not_project_related}")
.public_or_visible_to_user(current_user) .public_or_visible_to_user(current_user)
end end
@ -86,18 +89,20 @@ class SnippetsFinder < UnionFinder
def feature_available_projects def feature_available_projects
# Don't return any project related snippets if the user cannot read cross project # Don't return any project related snippets if the user cannot read cross project
return table[:id].eq(nil) unless Ability.allowed?(current_user, :read_cross_project) return table[:id].eq(nil).to_sql unless Ability.allowed?(current_user, :read_cross_project)
projects = projects_for_user do |part| projects = projects_for_user do |part|
part.with_feature_available_for_user(:snippets, current_user) part.with_feature_available_for_user(:snippets, current_user)
end.select(:id) end.select(:id)
arel_query = Arel::Nodes::SqlLiteral.new(projects.to_sql) # This query was intentionally converted to a raw one to get it work in Rails 5.0.
table[:project_id].in(arel_query) # In Rails 5.0 and 5.1 there's a bug: https://github.com/rails/arel/issues/531
# Please convert it back when on rails 5.2 as it works again as expected since 5.2.
"snippets.project_id IN (#{projects.to_sql})"
end end
def not_project_related def not_project_related
table[:project_id].eq(nil) table[:project_id].eq(nil).to_sql
end end
def table def table

View File

@ -0,0 +1,5 @@
---
title: "[Rails5] Fix snippets_finder arel queries"
merge_request: 19796
author: "@blackst0ne"
type: fixed