acts_has_many 0.1.2 → 0.1.3
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.
- data/README.md +2 -4
- data/lib/acts_has_many/active_record/acts/has_many.rb +5 -4
- data/lib/acts_has_many/version.rb +1 -1
- data/spec/has_many_spec.rb +114 -62
- data/spec/has_many_through_spec.rb +106 -0
- data/spec/helper.rb +21 -6
- metadata +2 -1
data/README.md
CHANGED
@@ -99,7 +99,7 @@ delete_id # => 1
|
|
99
99
|
|
100
100
|
company.destroy # => true
|
101
101
|
|
102
|
-
# this situation with delete_id best way is "company.delete" because you miss
|
102
|
+
# this situation with delete_id best way is "company.delete" because you miss unnecessary check actuality
|
103
103
|
```
|
104
104
|
|
105
105
|
### has_many_update_through used with has_many :through and get array parameters
|
@@ -129,7 +129,5 @@ new_rows, delete_ids = Company.has_many_update_through( update: data, new: date,
|
|
129
129
|
|
130
130
|
user.companies = new_rows # update user companies
|
131
131
|
|
132
|
-
delete_ids
|
133
|
-
Company.finde(id).destroy # necessary for correct delete record ( will be fixed)
|
134
|
-
end
|
132
|
+
Company.delete(delete_ids) # for delete_ids from has_many_update_through best way is to use "delete" and miss unnecessary check
|
135
133
|
```
|
@@ -75,10 +75,11 @@ module ActiveRecord
|
|
75
75
|
unless options[:new].nil?
|
76
76
|
options[:new].uniq!
|
77
77
|
options[:new].each do |data|
|
78
|
-
|
78
|
+
data = data.symbolize_keys
|
79
79
|
record_add << #{self}
|
80
80
|
.where('#{options[:compare]}' => data['#{options[:compare]}'.to_sym])
|
81
81
|
.first_or_create(data)
|
82
|
+
record_del.delete record_add.last.id
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
@@ -117,7 +118,7 @@ module ActiveRecord
|
|
117
118
|
|
118
119
|
def has_many_update(options)
|
119
120
|
options_default = {
|
120
|
-
:data => { :
|
121
|
+
:data => { title: "" }
|
121
122
|
}
|
122
123
|
|
123
124
|
options = options_default.merge options
|
@@ -127,7 +128,7 @@ module ActiveRecord
|
|
127
128
|
object_id = id
|
128
129
|
delete_id = nil
|
129
130
|
|
130
|
-
if actuale? :
|
131
|
+
if actuale? relation: options[:relation]
|
131
132
|
# create new object and finish
|
132
133
|
object = model.where(full_compare).first_or_create(options[:data])
|
133
134
|
object_id = object.id
|
@@ -161,7 +162,7 @@ module ActiveRecord
|
|
161
162
|
# :relation( string, symbol) - exclude current relation
|
162
163
|
#
|
163
164
|
|
164
|
-
def actuale? (options = { :
|
165
|
+
def actuale? (options = { relation: "" })
|
165
166
|
actuale = false
|
166
167
|
|
167
168
|
depend_relations.each do |relation|
|
data/spec/has_many_spec.rb
CHANGED
@@ -1,70 +1,122 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
experience.location = location
|
12
|
-
Location.delete(del_loc) unless del_loc.nil?
|
13
|
-
|
14
|
-
experience.location.title.should == "ukraine"
|
15
|
-
Location.all.size.should == 1
|
16
|
-
|
17
|
-
Experience.create :location => location, :title => "test experience2"
|
3
|
+
(1..3).each do |c|
|
4
|
+
|
5
|
+
case c
|
6
|
+
when 1
|
7
|
+
class Location < ActiveRecord::Base
|
8
|
+
self.table_name = 'locations'
|
9
|
+
has_many :experiences
|
10
|
+
validates :title, :presence => true
|
18
11
|
|
19
|
-
|
20
|
-
|
21
|
-
experience.location = Location.find(add_loc)
|
22
|
-
Location.delete(del_loc) unless del_loc.nil?
|
23
|
-
|
24
|
-
experience.location.id.should == add_loc
|
25
|
-
Location.all.size.should == 2
|
26
|
-
|
27
|
-
add_loc, del_loc = experience.location.has_many_update(
|
28
|
-
:data => {"title" => "ukraine"}, :relation => "experiences")
|
29
|
-
experience.location = Location.find(add_loc)
|
30
|
-
Location.delete(del_loc) unless del_loc.nil?
|
31
|
-
|
32
|
-
experience.location.should == location
|
33
|
-
Location.all.size.should == 1
|
34
|
-
end
|
12
|
+
acts_has_many
|
13
|
+
end
|
35
14
|
|
36
|
-
|
37
|
-
Location
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
location.destroy
|
45
|
-
Location.all.size.should == 1
|
46
|
-
|
47
|
-
Experience.all[0].destroy
|
48
|
-
location.destroy
|
49
|
-
Location.all.size.should == 0
|
50
|
-
end
|
15
|
+
when 2
|
16
|
+
class Location < ActiveRecord::Base
|
17
|
+
self.table_name = 'locations'
|
18
|
+
acts_has_many relations: [:experiences], compare: :title
|
19
|
+
|
20
|
+
has_many :experiences
|
21
|
+
validates :title, :presence => true
|
22
|
+
end
|
51
23
|
|
52
|
-
|
53
|
-
Location
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
24
|
+
when 3
|
25
|
+
class Location < ActiveRecord::Base
|
26
|
+
self.table_name = 'locations'
|
27
|
+
acts_has_many relations: ['experiences'], compare: 'title'
|
28
|
+
|
29
|
+
has_many :experiences
|
30
|
+
validates :title, :presence => true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "Initialization tipe #{c}" do
|
35
|
+
describe 'acts_has_many' do
|
36
|
+
it 'update' do
|
37
|
+
Location.delete_all
|
38
|
+
Experience.delete_all
|
39
|
+
|
40
|
+
location = Location.create :title => "italy"
|
41
|
+
experience = Experience.create :location => location, :title => "test experience1"
|
42
|
+
|
43
|
+
add_loc, del_loc = experience.location.has_many_update(
|
44
|
+
:data => {"title" => "ukraine"}, :relation => "experiences")
|
45
|
+
|
46
|
+
Location.all.size.should == 1
|
47
|
+
location.id.should == add_loc
|
48
|
+
del_loc.should == nil
|
49
|
+
experience.location.title.should == "ukraine"
|
50
|
+
|
51
|
+
Experience.create :location => location, :title => "test experience2"
|
52
|
+
|
53
|
+
add_loc, del_loc = experience.location.has_many_update(
|
54
|
+
:data => {"title" => "italy"}, :relation => "experiences")
|
55
|
+
|
56
|
+
Location.all.size.should == 2
|
57
|
+
location.id.should_not == add_loc
|
58
|
+
del_loc.should == nil
|
59
|
+
experience.location = Location.find(add_loc)
|
60
|
+
experience.location.title.should == "italy"
|
61
|
+
|
62
|
+
add_loc, del_loc = experience.location.has_many_update(
|
63
|
+
:data => {"title" => "ukraine"}, :relation => "experiences")
|
64
|
+
|
65
|
+
location.id.should == add_loc
|
66
|
+
experience.location.id.should == del_loc
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'destroy' do
|
70
|
+
Location.delete_all
|
71
|
+
Experience.delete_all
|
72
|
+
|
73
|
+
location = Location.create(:title => "ukraine")
|
74
|
+
|
75
|
+
Experience.create( :location => location, :title => "test" )
|
76
|
+
|
77
|
+
location.destroy
|
78
|
+
Location.all.size.should == 1
|
79
|
+
|
80
|
+
Experience.all[0].destroy
|
81
|
+
location.destroy
|
82
|
+
Location.all.size.should == 0
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'actuale?' do
|
86
|
+
Location.delete_all
|
87
|
+
|
88
|
+
location = Location.create(:title => "ukraine")
|
89
|
+
|
90
|
+
location.actuale?.should == false
|
91
|
+
location.actuale?(:relation => "experiences").should == false
|
61
92
|
|
62
|
-
|
63
|
-
location.actuale?(:relation => "experiences").should == false
|
93
|
+
Experience.create( :title => 'test', :location => location )
|
64
94
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
95
|
+
location.actuale?.should == true
|
96
|
+
location.actuale?(:relation => "experiences").should == false
|
97
|
+
location.actuale?(:relation => :experiences).should == false
|
98
|
+
location.actuale?(:relation => "Experience").should == false
|
99
|
+
|
100
|
+
Experience.create( :title => 'test', :location => location )
|
101
|
+
|
102
|
+
location.actuale?.should == true
|
103
|
+
location.actuale?(:relation => "experiences").should == true
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'compare' do
|
107
|
+
location = Location.create(:title => "ukraine")
|
108
|
+
location.compare.should == :title
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'model' do
|
112
|
+
location = Location.create(:title => "ukraine")
|
113
|
+
location.model.should == Location
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'depend_relations' do
|
117
|
+
location = Location.create(:title => "ukraine")
|
118
|
+
location.depend_relations.should == ['experiences']
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
70
122
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
(1..3).each do |c|
|
4
|
+
|
5
|
+
case c
|
6
|
+
when 1
|
7
|
+
class Local < ActiveRecord::Base
|
8
|
+
self.table_name = 'locals'
|
9
|
+
validates :title, :presence => true
|
10
|
+
|
11
|
+
has_many :companies, :through => :company_locals
|
12
|
+
acts_has_many :through => true
|
13
|
+
has_many :company_locals
|
14
|
+
end
|
15
|
+
|
16
|
+
when 2
|
17
|
+
class Local < ActiveRecord::Base
|
18
|
+
self.table_name = 'locals'
|
19
|
+
validates :title, :presence => true
|
20
|
+
|
21
|
+
has_many :companies, :through => :company_locals
|
22
|
+
has_many :company_locals
|
23
|
+
acts_has_many through: true, relations: [:companies], compare: :title
|
24
|
+
end
|
25
|
+
|
26
|
+
when 3
|
27
|
+
class Local < ActiveRecord::Base
|
28
|
+
self.table_name = 'locals'
|
29
|
+
validates :title, :presence => true
|
30
|
+
|
31
|
+
has_many :companies, :through => :company_locals
|
32
|
+
has_many :company_locals
|
33
|
+
acts_has_many :through => true, relations: ['companies'], compare: 'title'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "Initialization tipe #{c}" do
|
38
|
+
describe 'acts_has_many with :through' do
|
39
|
+
it 'update' do
|
40
|
+
Local.delete_all
|
41
|
+
|
42
|
+
Local.all.size.should == 0
|
43
|
+
|
44
|
+
new_row, del_ids = Local.has_many_through_update( :new => [
|
45
|
+
{ title: 'test0'},
|
46
|
+
{ title: 'test1'},
|
47
|
+
{ title: 'test2'},
|
48
|
+
{ title: 'test3'},
|
49
|
+
{ title: 'test0'},
|
50
|
+
], relation: :companies)
|
51
|
+
|
52
|
+
new_row.count.should == 4
|
53
|
+
del_ids.should == []
|
54
|
+
Local.all.size.should == 4
|
55
|
+
|
56
|
+
new_row1, del_ids1 = Local.has_many_through_update(
|
57
|
+
:new => [
|
58
|
+
{ title: 'test0'},
|
59
|
+
{ 'title' => 'test1'}],
|
60
|
+
:update => {
|
61
|
+
new_row[2].id => {title: 'test2s'},
|
62
|
+
new_row[3].id.to_s => {'title' => 'test3s'}
|
63
|
+
}, relation: 'companies')
|
64
|
+
|
65
|
+
new_row1[0].id.should == new_row[0].id
|
66
|
+
new_row1[1].id.should == new_row[1].id
|
67
|
+
new_row1[2].id.should == new_row[2].id
|
68
|
+
new_row1[3].id.should == new_row[3].id
|
69
|
+
del_ids1.should == []
|
70
|
+
Local.find(new_row[2].id).title.should == 'test2s'
|
71
|
+
Local.find(new_row[3].id).title.should == 'test3s'
|
72
|
+
Local.all.size.should == 4
|
73
|
+
|
74
|
+
|
75
|
+
new_row, del_ids = Local.has_many_through_update(
|
76
|
+
:new => [
|
77
|
+
{ title: 'test0'},
|
78
|
+
{ title: 'test3s'}],
|
79
|
+
:update => {
|
80
|
+
new_row1[2].id => {title: 'test2s'},
|
81
|
+
new_row1[3].id => {title: ''}
|
82
|
+
}, relation: :companies)
|
83
|
+
|
84
|
+
del_ids.should == []
|
85
|
+
new_row.size.should == 3
|
86
|
+
|
87
|
+
new_row, del_ids = Local.has_many_through_update(
|
88
|
+
:update => {
|
89
|
+
new_row1[2].id => {title: 'test2s'},
|
90
|
+
new_row1[3].id => {title: ''}
|
91
|
+
}, relation: :companies)
|
92
|
+
|
93
|
+
del_ids.should == [new_row1[3].id]
|
94
|
+
new_row.size.should == 1
|
95
|
+
|
96
|
+
new_row, del_ids = Local.has_many_through_update(
|
97
|
+
:new => [{ title: 'test0'}],
|
98
|
+
:update => { new_row1[2].id => {title: 'test0'} }, relation: :companies)
|
99
|
+
|
100
|
+
new_row.size.should == 1
|
101
|
+
|
102
|
+
Local.all.size.should == 4
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/spec/helper.rb
CHANGED
@@ -23,6 +23,17 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
23
23
|
create_table :locations do |t|
|
24
24
|
t.string :title
|
25
25
|
end
|
26
|
+
|
27
|
+
create_table :locals do |t|
|
28
|
+
t.string :title
|
29
|
+
end
|
30
|
+
create_table :company_locals do |t|
|
31
|
+
t.references :local
|
32
|
+
t.references :company
|
33
|
+
end
|
34
|
+
create_table :companies do |t|
|
35
|
+
t.string :title
|
36
|
+
end
|
26
37
|
end
|
27
38
|
|
28
39
|
class Experience < ActiveRecord::Base
|
@@ -30,10 +41,14 @@ class Experience < ActiveRecord::Base
|
|
30
41
|
belongs_to :location, :dependent => :destroy
|
31
42
|
end
|
32
43
|
|
33
|
-
class
|
34
|
-
self.table_name = '
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
44
|
+
class CompanyLocal < ActiveRecord::Base
|
45
|
+
self.table_name = 'company_locals'
|
46
|
+
belongs_to :local
|
47
|
+
belongs_to :company
|
48
|
+
end
|
49
|
+
|
50
|
+
class Company < ActiveRecord::Base
|
51
|
+
self.table_name = 'companies'
|
52
|
+
has_many :company_locals, :dependent => :destroy
|
53
|
+
has_many :locals, :through => :company_locals
|
39
54
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_has_many
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/acts_has_many/active_record/acts/has_many.rb
|
92
92
|
- lib/acts_has_many/version.rb
|
93
93
|
- spec/has_many_spec.rb
|
94
|
+
- spec/has_many_through_spec.rb
|
94
95
|
- spec/helper.rb
|
95
96
|
homepage: https://github.com/igor04/acts_has_many
|
96
97
|
licenses: []
|