Feature #44374 » 0001-Cache-builtin-group-instances-per-request-to-avoid-r.patch
| app/models/group_builtin.rb | ||
|---|---|---|
| 18 | 18 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 19 | 19 |
class GroupBuiltin < Group |
| 20 |
class Current < ActiveSupport::CurrentAttributes |
|
| 21 |
attribute :instances |
|
| 22 |
end |
|
| 23 | ||
| 20 | 24 |
validate :validate_uniqueness, :on => :create |
| 21 | 25 |
def validate_uniqueness |
| ... | ... | |
| 40 | 44 |
def load_instance |
| 41 | 45 |
return nil if self == GroupBuiltin |
| 42 |
instance = unscoped.order(:id).first || create_instance |
|
| 46 |
Current.instances ||= {}
|
|
| 47 |
Current.instances[self] ||= unscoped.order(:id).first || create_instance |
|
| 43 | 48 |
end |
| 44 | 49 |
def create_instance |
| test/unit/group_test.rb | ||
|---|---|---|
| 18 | 18 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 19 | 19 |
require_relative '../test_helper' |
| 20 |
require 'active_record/testing/query_assertions' |
|
| 20 | 21 |
class GroupTest < ActiveSupport::TestCase |
| 21 | 22 |
include Redmine::I18n |
| 23 |
include ActiveRecord::Assertions::QueryAssertions |
|
| 22 | 24 |
def setup |
| 23 | 25 |
User.current = nil |
| ... | ... | |
| 150 | 152 |
end |
| 151 | 153 |
end |
| 154 |
def test_builtin_groups_should_be_cached_until_current_attributes_reset |
|
| 155 |
assert_queries_count(1) { Group.anonymous }
|
|
| 156 |
assert_no_queries { Group.anonymous }
|
|
| 157 | ||
| 158 |
GroupBuiltin::Current.reset |
|
| 159 | ||
| 160 |
assert_queries_count(1) { Group.anonymous }
|
|
| 161 |
end |
|
| 162 | ||
| 152 | 163 |
def test_builtin_in_group_should_be_uniq |
| 153 | 164 |
group = GroupAnonymous.new |
| 154 | 165 |
group.name = 'Foo' |