diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-10-10 16:59:21 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-10 16:59:21 +0900 |
commit | a52c6989a0aacc50b35891265a0b5631e1ec2370 (patch) | |
tree | 1c702f4a71d0de57fa8e94d62432a2ee32af8f20 /activerecord/lib/active_record/relation/delegation.rb | |
parent | 6c69a96048f61b280076412eab37c9134ddb7440 (diff) | |
parent | 136b738cd261a7f54f478f9fb160afb9f5e50a02 (diff) | |
download | rails-a52c6989a0aacc50b35891265a0b5631e1ec2370.tar.gz rails-a52c6989a0aacc50b35891265a0b5631e1ec2370.tar.bz2 rails-a52c6989a0aacc50b35891265a0b5631e1ec2370.zip |
Merge pull request #34122 from kamipo/generate_relation_methods
Generate delegation methods to named scope in the definition time
Diffstat (limited to 'activerecord/lib/active_record/relation/delegation.rb')
-rw-r--r-- | activerecord/lib/active_record/relation/delegation.rb | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/relation/delegation.rb b/activerecord/lib/active_record/relation/delegation.rb index 8f657840f5..383dc1bf4b 100644 --- a/activerecord/lib/active_record/relation/delegation.rb +++ b/activerecord/lib/active_record/relation/delegation.rb @@ -17,6 +17,7 @@ module ActiveRecord delegate = Class.new(klass) { include ClassSpecificRelation } + include_relation_methods(delegate) mangled_name = klass.name.gsub("::", "_") const_set mangled_name, delegate private_constant mangled_name @@ -29,6 +30,35 @@ module ActiveRecord child_class.initialize_relation_delegate_cache super end + + protected + def include_relation_methods(delegate) + superclass.include_relation_methods(delegate) unless base_class? + delegate.include generated_relation_methods + end + + private + def generated_relation_methods + @generated_relation_methods ||= Module.new.tap do |mod| + mod_name = "GeneratedRelationMethods" + const_set mod_name, mod + private_constant mod_name + end + end + + def generate_relation_method(method) + if /\A[a-zA-Z_]\w*[!?]?\z/.match?(method) + generated_relation_methods.module_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(*args, &block) + scoping { klass.#{method}(*args, &block) } + end + RUBY + else + generated_relation_methods.send(:define_method, method) do |*args, &block| + scoping { klass.public_send(method, *args, &block) } + end + end + end end extend ActiveSupport::Concern |