activerecord-alias_association 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +0 -4
- data/README.md +32 -5
- data/activerecord-alias_association.gemspec +1 -1
- data/lib/active_record/alias_association.rb +28 -2
- data/lib/active_record/extension/associations.rb +47 -0
- data/lib/activerecord-alias_association.rb +2 -0
- data/lib/activerecord/alias_association/version.rb +1 -1
- metadata +5 -6
- data/gemfiles/activerecord.4.1.x.gemfile +0 -6
- data/gemfiles/activerecord.4.2.x.gemfile +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83dc002c673c1efbe64f4d5a005cfb49aab34ed4
|
4
|
+
data.tar.gz: d8ab3301efe4f68fde9bc7d3e83dca09a82afcb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bf1517d700cea8f58e2a373a318fd7d8327d4d728204863daf4d5afa6f9678e004e2e27471fae778122a888c7da9701e6653882e16c166f610c05e63a408b84
|
7
|
+
data.tar.gz: 3070307c4e2675825d8c5de85ddace49b7d3aa2f4080f48e10859f18ec1daf03ad2cdabc553301e72d05290e6cefe17b65288307e095e9e8c5f44123d2f99da1
|
data/.travis.yml
CHANGED
@@ -22,10 +22,6 @@ matrix:
|
|
22
22
|
|
23
23
|
- rvm: 2.3.8
|
24
24
|
gemfile: gemfiles/activerecord.5.2.x.gemfile
|
25
|
-
- rvm: 2.3.8
|
26
|
-
gemfile: gemfiles/activerecord.4.2.x.gemfile
|
27
|
-
- rvm: 2.3.8
|
28
|
-
gemfile: gemfiles/activerecord.4.1.x.gemfile
|
29
25
|
|
30
26
|
- rvm: 2.2.10
|
31
27
|
gemfile: gemfiles/activerecord.5.2.x.gemfile
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[](https://travis-ci.org/Jun0kada/activerecord-alias_association)
|
4
4
|
|
5
5
|
ActiveRecord Association alias
|
6
|
-
`belongs_to`, `has_one`, `has_many`, `
|
6
|
+
`belongs_to`, `has_one`, `has_many`, `has_and_belongs_to_many`
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -25,7 +25,7 @@ Or install it yourself as:
|
|
25
25
|
|
26
26
|
```ruby
|
27
27
|
class User < ActiveRecord::Base
|
28
|
-
belongs_to :team, alias: :organization
|
28
|
+
belongs_to :team, alias: [:organization, :club]
|
29
29
|
|
30
30
|
has_one :profile, alias: :info
|
31
31
|
|
@@ -33,6 +33,8 @@ class User < ActiveRecord::Base
|
|
33
33
|
|
34
34
|
has_many :post_images, through: :users, source: :images, alias: :article_images
|
35
35
|
|
36
|
+
has_and_belongs_to_many :tags, alias: :categories
|
37
|
+
|
36
38
|
# or
|
37
39
|
|
38
40
|
belongs_to :team
|
@@ -46,14 +48,39 @@ class User < ActiveRecord::Base
|
|
46
48
|
|
47
49
|
has_many :post_images, through: :users, source: :images
|
48
50
|
alias_association :article_images, :post_images
|
51
|
+
|
52
|
+
has_and_belongs_to_many :tags
|
53
|
+
alias_association :categories, :tags
|
49
54
|
end
|
50
55
|
```
|
51
56
|
|
52
|
-
|
57
|
+
### Accessors & Constructors
|
53
58
|
|
54
|
-
|
59
|
+
```ruby
|
60
|
+
user = User.first
|
61
|
+
|
62
|
+
# belongs_to, has_one
|
63
|
+
user.organization
|
64
|
+
user.organization=
|
65
|
+
user.build_organization
|
66
|
+
user.create_organization
|
67
|
+
user.create_organization!
|
68
|
+
user.reload_organization
|
69
|
+
|
70
|
+
# nas_many, has_and_belongs_to_many
|
71
|
+
user.posts
|
72
|
+
user.posts=
|
73
|
+
user.post_ids
|
74
|
+
user.post_ids=
|
75
|
+
```
|
55
76
|
|
56
|
-
|
77
|
+
### ActiveRecord QueryMethods
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
User.includes(:organization, :posts, :tags)
|
81
|
+
User.preload(:organization, :posts, :tags)
|
82
|
+
User.eager_load(:organization, :posts, :tags)
|
83
|
+
```
|
57
84
|
|
58
85
|
## Contributing
|
59
86
|
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ['lib']
|
23
23
|
|
24
|
-
spec.add_dependency 'activerecord', '>=
|
24
|
+
spec.add_dependency 'activerecord', '>= 5.0.0'
|
25
25
|
|
26
26
|
spec.add_development_dependency 'bundler'
|
27
27
|
spec.add_development_dependency 'rake'
|
@@ -9,7 +9,7 @@ module ActiveRecord
|
|
9
9
|
module AssociationBuilderExtension
|
10
10
|
def self.build(model, reflection)
|
11
11
|
Array.wrap(reflection.options[:alias]).each do |new_name|
|
12
|
-
model.send(:alias_association, new_name, reflection.name)
|
12
|
+
model.send(:alias_association, new_name, reflection.name, reflection)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -19,11 +19,37 @@ module ActiveRecord
|
|
19
19
|
end
|
20
20
|
|
21
21
|
module ClassMethods
|
22
|
-
def alias_association(new_name, old_name)
|
22
|
+
def alias_association(new_name, old_name, reflection = nil)
|
23
|
+
reflection ||= reflect_on_association(old_name)
|
24
|
+
|
25
|
+
raise NoMethodError, "undefined #{old_name} association for #{self}" unless reflection
|
26
|
+
|
23
27
|
generated_association_methods.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
24
28
|
alias_method :#{new_name}, :#{old_name}
|
25
29
|
alias_method :#{new_name}=, :#{old_name}=
|
26
30
|
CODE
|
31
|
+
|
32
|
+
case reflection.macro
|
33
|
+
when :belongs_to, :has_one
|
34
|
+
generated_association_methods.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
35
|
+
alias_method "reload_#{new_name}", "reload_#{old_name}"
|
36
|
+
CODE
|
37
|
+
|
38
|
+
unless reflection.polymorphic?
|
39
|
+
generated_association_methods.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
40
|
+
alias_method "build_#{new_name}", "build_#{old_name}"
|
41
|
+
alias_method "create_#{new_name}", "create_#{old_name}"
|
42
|
+
alias_method "create_#{new_name}!", "create_#{old_name}!"
|
43
|
+
CODE
|
44
|
+
end
|
45
|
+
when :has_many, :has_and_belongs_to_many
|
46
|
+
generated_association_methods.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
47
|
+
alias_method "#{new_name.to_s.singularize}_ids", "#{old_name.to_s.singularize}_ids"
|
48
|
+
alias_method "#{new_name.to_s.singularize}_ids=", "#{old_name.to_s.singularize}_ids="
|
49
|
+
CODE
|
50
|
+
else
|
51
|
+
raise "Unsupported #{reflection.macro} reflection."
|
52
|
+
end
|
27
53
|
end
|
28
54
|
|
29
55
|
def reflect_on_association(association)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Extension
|
3
|
+
module Associations
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def has_and_belongs_to_many(name, scope = nil, **options, &extension)
|
8
|
+
habtm_reflection = ActiveRecord::Reflection::HasAndBelongsToManyReflection.new(name, scope, options, self)
|
9
|
+
|
10
|
+
builder = ActiveRecord::Associations::Builder::HasAndBelongsToMany.new name, self, options
|
11
|
+
|
12
|
+
join_model = builder.through_model
|
13
|
+
|
14
|
+
const_set join_model.name, join_model
|
15
|
+
private_constant join_model.name
|
16
|
+
|
17
|
+
middle_reflection = builder.middle_reflection join_model
|
18
|
+
|
19
|
+
ActiveRecord::Associations::Builder::HasMany.define_callbacks self, middle_reflection
|
20
|
+
ActiveRecord::Reflection.add_reflection self, middle_reflection.name, middle_reflection
|
21
|
+
middle_reflection.parent_reflection = habtm_reflection
|
22
|
+
|
23
|
+
include Module.new {
|
24
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
25
|
+
def destroy_associations
|
26
|
+
association(:#{middle_reflection.name}).delete_all(:delete_all)
|
27
|
+
association(:#{name}).reset
|
28
|
+
super
|
29
|
+
end
|
30
|
+
RUBY
|
31
|
+
}
|
32
|
+
|
33
|
+
hm_options = {}
|
34
|
+
hm_options[:through] = middle_reflection.name
|
35
|
+
hm_options[:source] = join_model.right_reflection.name
|
36
|
+
|
37
|
+
[:alias, :before_add, :after_add, :before_remove, :after_remove, :autosave, :validate, :join_table, :class_name, :extend].each do |k|
|
38
|
+
hm_options[k] = options[k] if options.key? k
|
39
|
+
end
|
40
|
+
|
41
|
+
has_many name, scope, hm_options, &extension
|
42
|
+
_reflections[name.to_s].parent_reflection = habtm_reflection
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'activerecord/alias_association/version'
|
2
2
|
require 'active_record'
|
3
3
|
require 'active_record/alias_association'
|
4
|
+
require 'active_record/extension/associations'
|
4
5
|
|
5
6
|
module ActiveRecord
|
6
7
|
class Base
|
7
8
|
include ActiveRecord::AliasAssociation
|
9
|
+
include ActiveRecord::Extension::Associations
|
8
10
|
end
|
9
11
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-alias_association
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jun0kada
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 5.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 5.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,12 +98,11 @@ files:
|
|
98
98
|
- activerecord-alias_association.gemspec
|
99
99
|
- bin/console
|
100
100
|
- bin/setup
|
101
|
-
- gemfiles/activerecord.4.1.x.gemfile
|
102
|
-
- gemfiles/activerecord.4.2.x.gemfile
|
103
101
|
- gemfiles/activerecord.5.0.x.gemfile
|
104
102
|
- gemfiles/activerecord.5.1.x.gemfile
|
105
103
|
- gemfiles/activerecord.5.2.x.gemfile
|
106
104
|
- lib/active_record/alias_association.rb
|
105
|
+
- lib/active_record/extension/associations.rb
|
107
106
|
- lib/activerecord-alias_association.rb
|
108
107
|
- lib/activerecord/alias_association/version.rb
|
109
108
|
homepage: https://github.com/Jun0kada/activerecord-alias_association
|