diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-07-05 13:04:38 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-07-05 13:04:38 +0000 |
commit | a1f17b982c72dd790ff58c3262b4431dfadd3c9b (patch) | |
tree | 735e40c778e9a6587c1fb0c2eb950a3edccdcbe2 /app/models/role.rb | |
parent | cc2ee90f9797d3657d24589774374ba1d9867b8f (diff) | |
download | redmine-a1f17b982c72dd790ff58c3262b4431dfadd3c9b.tar.gz redmine-a1f17b982c72dd790ff58c3262b4431dfadd3c9b.zip |
Perf: use a custom decoder for Role#permissions instead of YAML.load.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9916 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/role.rb')
-rw-r--r-- | app/models/role.rb | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/app/models/role.rb b/app/models/role.rb index c8a1028da..8e8737afb 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -16,6 +16,19 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class Role < ActiveRecord::Base + # Custom coder for the permissions attribute that should be an + # array of symbols. Rails 3 uses Psych which can be *unbelievably* + # slow on some platforms (eg. mingw32). + class PermissionsAttributeCoder + def self.load(str) + str.to_s.scan(/:([a-z0-9_]+)/).flatten.map(&:to_sym) + end + + def self.dump(value) + YAML.dump(value) + end + end + # Built-in roles BUILTIN_NON_MEMBER = 1 BUILTIN_ANONYMOUS = 2 @@ -44,7 +57,7 @@ class Role < ActiveRecord::Base has_many :members, :through => :member_roles acts_as_list - serialize :permissions, Array + serialize :permissions, ::Role::PermissionsAttributeCoder attr_protected :builtin validates_presence_of :name @@ -54,10 +67,6 @@ class Role < ActiveRecord::Base :in => ISSUES_VISIBILITY_OPTIONS.collect(&:first), :if => lambda {|role| role.respond_to?(:issues_visibility)} - def permissions - read_attribute(:permissions) || [] - end - def permissions=(perms) perms = perms.collect {|p| p.to_sym unless p.blank? }.compact.uniq if perms write_attribute(:permissions, perms) |