Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Jérome Perrin
gitlab-ce
Commits
4d6ee98d
Commit
4d6ee98d
authored
Jun 27, 2017
by
Douwe Maan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Drop default ORDER scope when calling a find method on a Sortable model
parent
585e6aa5
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
52 additions
and
4 deletions
+52
-4
app/controllers/projects/issues_controller.rb
app/controllers/projects/issues_controller.rb
+1
-1
app/models/concerns/sortable.rb
app/models/concerns/sortable.rb
+23
-0
app/models/project.rb
app/models/project.rb
+3
-3
changelogs/unreleased/dm-drop-default-scope-on-sortable-finders.yml
.../unreleased/dm-drop-default-scope-on-sortable-finders.yml
+4
-0
spec/models/concerns/sortable_spec.rb
spec/models/concerns/sortable_spec.rb
+21
-0
No files found.
app/controllers/projects/issues_controller.rb
View file @
4d6ee98d
...
@@ -227,7 +227,7 @@ class Projects::IssuesController < Projects::ApplicationController
...
@@ -227,7 +227,7 @@ class Projects::IssuesController < Projects::ApplicationController
def
issue
def
issue
return
@issue
if
defined?
(
@issue
)
return
@issue
if
defined?
(
@issue
)
# The Sortable default scope causes performance issues when used with find_by
# The Sortable default scope causes performance issues when used with find_by
@noteable
=
@issue
||=
@project
.
issues
.
where
(
iid:
params
[
:id
]).
reorder
(
nil
).
take!
@noteable
=
@issue
||=
@project
.
issues
.
find_by!
(
iid:
params
[
:id
])
return
render_404
unless
can?
(
current_user
,
:read_issue
,
@issue
)
return
render_404
unless
can?
(
current_user
,
:read_issue
,
@issue
)
...
...
app/models/concerns/sortable.rb
View file @
4d6ee98d
...
@@ -5,6 +5,25 @@
...
@@ -5,6 +5,25 @@
module
Sortable
module
Sortable
extend
ActiveSupport
::
Concern
extend
ActiveSupport
::
Concern
module
DropDefaultScopeOnFinders
# Override these methods to drop the `ORDER BY id DESC` default scope.
# See http://dba.stackexchange.com/a/110919 for why we do this.
%i[find find_by find_by!]
.
each
do
|
meth
|
define_method
meth
do
|*
args
,
&
block
|
return
super
(
*
args
,
&
block
)
if
block
unordered_relation
=
unscope
(
:order
)
# We cannot simply call `meth` on `unscope(:order)`, since that is also
# an instance of the same relation class this module is included into,
# which means we'd get infinite recursion.
# We explicitly use the original implementation to prevent this.
original_impl
=
method
(
__method__
).
super_method
.
unbind
original_impl
.
bind
(
unordered_relation
).
call
(
*
args
)
end
end
end
included
do
included
do
# By default all models should be ordered
# By default all models should be ordered
# by created_at field starting from newest
# by created_at field starting from newest
...
@@ -18,6 +37,10 @@ module Sortable
...
@@ -18,6 +37,10 @@ module Sortable
scope
:order_updated_asc
,
->
{
reorder
(
updated_at: :asc
)
}
scope
:order_updated_asc
,
->
{
reorder
(
updated_at: :asc
)
}
scope
:order_name_asc
,
->
{
reorder
(
name: :asc
)
}
scope
:order_name_asc
,
->
{
reorder
(
name: :asc
)
}
scope
:order_name_desc
,
->
{
reorder
(
name: :desc
)
}
scope
:order_name_desc
,
->
{
reorder
(
name: :desc
)
}
# All queries (relations) on this model are instances of this `relation_klass`.
relation_klass
=
relation_delegate_class
(
ActiveRecord
::
Relation
)
relation_klass
.
prepend
DropDefaultScopeOnFinders
end
end
module
ClassMethods
module
ClassMethods
...
...
app/models/project.rb
View file @
4d6ee98d
...
@@ -823,7 +823,7 @@ class Project < ActiveRecord::Base
...
@@ -823,7 +823,7 @@ class Project < ActiveRecord::Base
end
end
def
ci_service
def
ci_service
@ci_service
||=
ci_services
.
reorder
(
nil
).
find_by
(
active:
true
)
@ci_service
||=
ci_services
.
find_by
(
active:
true
)
end
end
def
deployment_services
def
deployment_services
...
@@ -831,7 +831,7 @@ class Project < ActiveRecord::Base
...
@@ -831,7 +831,7 @@ class Project < ActiveRecord::Base
end
end
def
deployment_service
def
deployment_service
@deployment_service
||=
deployment_services
.
reorder
(
nil
).
find_by
(
active:
true
)
@deployment_service
||=
deployment_services
.
find_by
(
active:
true
)
end
end
def
monitoring_services
def
monitoring_services
...
@@ -839,7 +839,7 @@ class Project < ActiveRecord::Base
...
@@ -839,7 +839,7 @@ class Project < ActiveRecord::Base
end
end
def
monitoring_service
def
monitoring_service
@monitoring_service
||=
monitoring_services
.
reorder
(
nil
).
find_by
(
active:
true
)
@monitoring_service
||=
monitoring_services
.
find_by
(
active:
true
)
end
end
def
jira_tracker?
def
jira_tracker?
...
...
changelogs/unreleased/dm-drop-default-scope-on-sortable-finders.yml
0 → 100644
View file @
4d6ee98d
---
title
:
Drop default ORDER scope when calling a find method on a Sortable model
merge_request
:
author
:
spec/models/concerns/sortable_spec.rb
0 → 100644
View file @
4d6ee98d
require
'spec_helper'
describe
Sortable
do
let
(
:relation
)
{
Issue
.
all
}
describe
'#where'
do
it
'orders by id, descending'
do
order_node
=
relation
.
where
(
iid:
1
).
order_values
.
first
expect
(
order_node
).
to
be_a
(
Arel
::
Nodes
::
Descending
)
expect
(
order_node
.
expr
.
name
).
to
eq
(
:id
)
end
end
describe
'#find_by'
do
it
'does not order'
do
expect
(
relation
).
to
receive
(
:unscope
).
with
(
:order
).
and_call_original
relation
.
find_by
(
iid:
1
)
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment