sequel 4.7.0 → 4.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +46 -0
- data/README.rdoc +25 -1
- data/doc/active_record.rdoc +1 -1
- data/doc/advanced_associations.rdoc +143 -17
- data/doc/association_basics.rdoc +80 -59
- data/doc/release_notes/4.8.0.txt +175 -0
- data/lib/sequel/adapters/odbc.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +4 -2
- data/lib/sequel/adapters/shared/postgres.rb +19 -3
- data/lib/sequel/adapters/shared/sqlite.rb +3 -3
- data/lib/sequel/ast_transformer.rb +1 -1
- data/lib/sequel/dataset/actions.rb +1 -1
- data/lib/sequel/dataset/graph.rb +23 -9
- data/lib/sequel/dataset/misc.rb +2 -2
- data/lib/sequel/dataset/sql.rb +3 -3
- data/lib/sequel/extensions/columns_introspection.rb +1 -1
- data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +1 -1
- data/lib/sequel/extensions/pg_array_ops.rb +6 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +7 -0
- data/lib/sequel/extensions/pg_json_ops.rb +5 -0
- data/lib/sequel/extensions/query.rb +8 -2
- data/lib/sequel/extensions/to_dot.rb +1 -1
- data/lib/sequel/model/associations.rb +476 -152
- data/lib/sequel/plugins/class_table_inheritance.rb +11 -3
- data/lib/sequel/plugins/dataset_associations.rb +21 -18
- data/lib/sequel/plugins/many_through_many.rb +87 -20
- data/lib/sequel/plugins/nested_attributes.rb +12 -0
- data/lib/sequel/plugins/pg_array_associations.rb +31 -12
- data/lib/sequel/plugins/single_table_inheritance.rb +9 -1
- data/lib/sequel/sql.rb +1 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +2 -2
- data/spec/adapters/postgres_spec.rb +7 -0
- data/spec/core/object_graph_spec.rb +250 -196
- data/spec/extensions/core_refinements_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +100 -6
- data/spec/extensions/many_through_many_spec.rb +1002 -19
- data/spec/extensions/nested_attributes_spec.rb +24 -0
- data/spec/extensions/pg_array_associations_spec.rb +17 -12
- data/spec/extensions/pg_array_spec.rb +4 -2
- data/spec/extensions/spec_helper.rb +1 -1
- data/spec/integration/associations_test.rb +1003 -48
- data/spec/integration/dataset_test.rb +12 -5
- data/spec/integration/prepared_statement_test.rb +1 -1
- data/spec/integration/type_test.rb +1 -1
- data/spec/model/associations_spec.rb +467 -130
- data/spec/model/eager_loading_spec.rb +332 -5
- metadata +5 -3
@@ -71,6 +71,30 @@ describe "NestedAttributes plugin" do
|
|
71
71
|
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
72
72
|
end
|
73
73
|
|
74
|
+
it "should support creating new one_to_many and one_to_one objects with presence validations on the foreign key" do
|
75
|
+
@Album.class_eval do
|
76
|
+
plugin :validation_helpers
|
77
|
+
def validate
|
78
|
+
validates_presence :artist_id
|
79
|
+
super
|
80
|
+
end
|
81
|
+
end
|
82
|
+
a = @Artist.new({:name=>'Ar', :albums_attributes=>[{:name=>'Al'}]})
|
83
|
+
@db.sqls.should == []
|
84
|
+
a.save
|
85
|
+
check_sql_array("INSERT INTO artists (name) VALUES ('Ar')",
|
86
|
+
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
87
|
+
|
88
|
+
a = @Artist.new(:name=>'Ar')
|
89
|
+
a.id = 1
|
90
|
+
a.first_album_attributes = {:name=>'Al'}
|
91
|
+
@db.sqls.should == []
|
92
|
+
a.save
|
93
|
+
check_sql_array(["INSERT INTO artists (name, id) VALUES ('Ar', 1)", "INSERT INTO artists (id, name) VALUES (1, 'Ar')"],
|
94
|
+
"UPDATE albums SET artist_id = NULL WHERE (artist_id = 1)",
|
95
|
+
["INSERT INTO albums (artist_id, name) VALUES (1, 'Al')", "INSERT INTO albums (name, artist_id) VALUES ('Al', 1)"])
|
96
|
+
end
|
97
|
+
|
74
98
|
it "should support creating new many_to_many objects" do
|
75
99
|
a = @Album.new({:name=>'Al', :tags_attributes=>[{:name=>'T'}]})
|
76
100
|
@db.sqls.should == []
|
@@ -69,8 +69,8 @@ describe Sequel::Model, "pg_array_associations" do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should allowing filtering by associations with :conditions" do
|
72
|
-
@c1.filter(:a_tags=>@o2).sql.should == "SELECT * FROM artists WHERE
|
73
|
-
@c2.filter(:a_artists=>@o1).sql.should == "SELECT * FROM tags WHERE (
|
72
|
+
@c1.filter(:a_tags=>@o2).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id = 2)))), 'f')"
|
73
|
+
@c2.filter(:a_artists=>@o1).sql.should == "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id = 1))))"
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should allowing excluding by associations" do
|
@@ -79,8 +79,8 @@ describe Sequel::Model, "pg_array_associations" do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
it "should allowing excluding by associations with :conditions" do
|
82
|
-
@c1.exclude(:a_tags=>@o2).sql.should == "SELECT * FROM artists WHERE (NOT
|
83
|
-
@c2.exclude(:a_artists=>@o1).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (
|
82
|
+
@c1.exclude(:a_tags=>@o2).sql.should == "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id = 2)))), 'f') OR (artists.tag_ids IS NULL))"
|
83
|
+
@c2.exclude(:a_artists=>@o1).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id = 1)))) OR (tags.id IS NULL))"
|
84
84
|
end
|
85
85
|
|
86
86
|
it "should allowing filtering by multiple associations" do
|
@@ -89,8 +89,8 @@ describe Sequel::Model, "pg_array_associations" do
|
|
89
89
|
end
|
90
90
|
|
91
91
|
it "should allowing filtering by multiple associations with :conditions" do
|
92
|
-
@c1.filter(:a_tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE
|
93
|
-
@c2.filter(:a_artists=>[@c1.load(:id=>7, :tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:id=>8, :tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE (
|
92
|
+
@c1.filter(:a_tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (1, 2))))), 'f')"
|
93
|
+
@c2.filter(:a_artists=>[@c1.load(:id=>7, :tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:id=>8, :tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (7, 8)))))"
|
94
94
|
end
|
95
95
|
|
96
96
|
it "should allowing excluding by multiple associations" do
|
@@ -99,8 +99,8 @@ describe Sequel::Model, "pg_array_associations" do
|
|
99
99
|
end
|
100
100
|
|
101
101
|
it "should allowing excluding by multiple associations with :conditions" do
|
102
|
-
@c1.exclude(:a_tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (NOT
|
103
|
-
@c2.exclude(:a_artists=>[@c1.load(:id=>7, :tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:id=>8, :tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (
|
102
|
+
@c1.exclude(:a_tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (1, 2))))), 'f') OR (artists.tag_ids IS NULL))"
|
103
|
+
@c2.exclude(:a_artists=>[@c1.load(:id=>7, :tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:id=>8, :tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (7, 8))))) OR (tags.id IS NULL))"
|
104
104
|
end
|
105
105
|
|
106
106
|
it "should allowing filtering/excluding associations with NULL or empty values" do
|
@@ -122,8 +122,8 @@ describe Sequel::Model, "pg_array_associations" do
|
|
122
122
|
end
|
123
123
|
|
124
124
|
it "should allowing filtering by association datasets with :conditions" do
|
125
|
-
@c1.filter(:a_tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE
|
126
|
-
@c2.filter(:a_artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE (
|
125
|
+
@c1.filter(:a_tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (id = 1)))))), 'f')"
|
126
|
+
@c2.filter(:a_artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (id = 1))))))"
|
127
127
|
end
|
128
128
|
|
129
129
|
it "should allowing excluding by association datasets" do
|
@@ -132,8 +132,8 @@ describe Sequel::Model, "pg_array_associations" do
|
|
132
132
|
end
|
133
133
|
|
134
134
|
it "should allowing excluding by association datasets with :conditions" do
|
135
|
-
@c1.exclude(:a_tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE (
|
136
|
-
@c2.exclude(:a_artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE (
|
135
|
+
@c1.exclude(:a_tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (id = 1)))))), 'f') OR (artists.tag_ids IS NULL))"
|
136
|
+
@c2.exclude(:a_artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (id = 1)))))) OR (tags.id IS NULL))"
|
137
137
|
end
|
138
138
|
|
139
139
|
it "filter by associations should respect key options" do
|
@@ -393,6 +393,11 @@ describe Sequel::Model, "pg_array_associations" do
|
|
393
393
|
DB.sqls.should == []
|
394
394
|
end
|
395
395
|
|
396
|
+
it "should support association_join" do
|
397
|
+
@c1.association_join(:tags).sql.should == "SELECT * FROM artists INNER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"
|
398
|
+
@c2.association_join(:artists).sql.should == "SELECT * FROM tags INNER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"
|
399
|
+
end
|
400
|
+
|
396
401
|
it "should eagerly graph associations" do
|
397
402
|
@c2.dataset._fetch = {:id=>2, :artists_id=>1, :tag_ids=>Sequel.pg_array([1,2,3])}
|
398
403
|
@c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
|
@@ -283,8 +283,10 @@ describe "pg_array extension" do
|
|
283
283
|
@db.typecast_value(:foo15_array, ['t']).should == [true]
|
284
284
|
end
|
285
285
|
|
286
|
-
it "should raise an error if using :scalar_oid option with unexisting scalar conversion proc" do
|
287
|
-
|
286
|
+
it "should not raise an error if using :scalar_oid option with unexisting scalar conversion proc" do
|
287
|
+
h = {}
|
288
|
+
Sequel::Postgres::PGArray.register('foo', :oid=>1234, :scalar_oid=>0, :type_procs=>h)
|
289
|
+
h[1234].call('{t}').should == ["t"]
|
288
290
|
end
|
289
291
|
|
290
292
|
it "should raise an error if using :converter option and a block argument" do
|
@@ -31,7 +31,7 @@ rescue LoadError
|
|
31
31
|
end
|
32
32
|
|
33
33
|
Sequel.extension :meta_def
|
34
|
-
Sequel.extension :core_refinements if RUBY_VERSION >= '2.0.0' &&
|
34
|
+
Sequel.extension :core_refinements if RUBY_VERSION >= '2.0.0' && RUBY_ENGINE == 'ruby'
|
35
35
|
|
36
36
|
def skip_warn(s)
|
37
37
|
warn "Skipping test of #{s}" if ENV["SKIPPED_TEST_WARN"]
|
@@ -29,6 +29,40 @@ shared_examples_for "one_to_one eager limit strategies" do
|
|
29
29
|
[@album, same_album].should include(a.first.first_album)
|
30
30
|
a.last.first_album.should == nil
|
31
31
|
end
|
32
|
+
|
33
|
+
specify "eager graphing one_to_one associations should work correctly" do
|
34
|
+
@album.update(:artist => @artist)
|
35
|
+
diff_album = @diff_album.call
|
36
|
+
ar = @pr.call[1]
|
37
|
+
ds = Artist.order(:artists__name)
|
38
|
+
limit_strategy = {:limit_strategy=>@els[:eager_limit_strategy]}
|
39
|
+
|
40
|
+
a = ds.eager_graph_with_options(:first_album, limit_strategy).all
|
41
|
+
a.should == [@artist, ar]
|
42
|
+
a.first.first_album.should == @album
|
43
|
+
a.last.first_album.should == nil
|
44
|
+
a.first.first_album.values.should == @album.values
|
45
|
+
|
46
|
+
a = ds.eager_graph_with_options(:last_album, limit_strategy).all
|
47
|
+
a = ds.eager_graph(:last_album).all
|
48
|
+
a.should == [@artist, ar]
|
49
|
+
a.first.last_album.should == diff_album
|
50
|
+
a.last.last_album.should == nil
|
51
|
+
a.first.last_album.values.should == diff_album.values
|
52
|
+
|
53
|
+
a = ds.eager_graph_with_options(:second_album, limit_strategy).all
|
54
|
+
a = ds.eager_graph(:second_album).all
|
55
|
+
a.should == [@artist, ar]
|
56
|
+
a.first.second_album.should == diff_album
|
57
|
+
a.last.second_album.should == nil
|
58
|
+
a.first.second_album.values.should == diff_album.values
|
59
|
+
|
60
|
+
same_album = @same_album.call
|
61
|
+
a = ds.eager_graph_with_options(:first_album, limit_strategy).all
|
62
|
+
a.should == [@artist, ar]
|
63
|
+
[@album, same_album].should include(a.first.first_album)
|
64
|
+
a.last.first_album.should == nil
|
65
|
+
end
|
32
66
|
end
|
33
67
|
|
34
68
|
shared_examples_for "one_to_many eager limit strategies" do
|
@@ -59,6 +93,88 @@ shared_examples_for "one_to_many eager limit strategies" do
|
|
59
93
|
ars.first.not_first_albums.map{|x| x.values}.should == [middle_album, diff_album].map{|x| x.values}
|
60
94
|
ars.first.last_two_albums.map{|x| x.values}.should == [diff_album, middle_album].map{|x| x.values}
|
61
95
|
end
|
96
|
+
|
97
|
+
specify "should correctly handle limits and offsets when eager graphing one_to_many associations" do
|
98
|
+
@album.update(:artist => @artist)
|
99
|
+
middle_album = @middle_album.call
|
100
|
+
diff_album = @diff_album.call
|
101
|
+
ar = @pr.call[1]
|
102
|
+
ds = Artist.order(:artists__name)
|
103
|
+
limit_strategy = {:limit_strategy=>@els[:eager_limit_strategy]}
|
104
|
+
|
105
|
+
ars = ds.eager_graph_with_options(:first_two_albums, limit_strategy).all
|
106
|
+
ars.should == [@artist, ar]
|
107
|
+
ars.first.first_two_albums.should == [@album, middle_album]
|
108
|
+
ars.last.first_two_albums.should == []
|
109
|
+
ars.first.first_two_albums.map{|x| x.values}.should == [@album, middle_album].map{|x| x.values}
|
110
|
+
|
111
|
+
ars = ds.eager_graph_with_options(:second_two_albums, limit_strategy).all
|
112
|
+
ars.should == [@artist, ar]
|
113
|
+
ars.first.second_two_albums.should == [middle_album, diff_album]
|
114
|
+
ars.last.second_two_albums.should == []
|
115
|
+
ars.first.second_two_albums.map{|x| x.values}.should == [middle_album, diff_album].map{|x| x.values}
|
116
|
+
|
117
|
+
ars = ds.eager_graph_with_options(:not_first_albums, limit_strategy).all
|
118
|
+
ars.should == [@artist, ar]
|
119
|
+
ars.first.not_first_albums.should == [middle_album, diff_album]
|
120
|
+
ars.last.not_first_albums.should == []
|
121
|
+
ars.first.not_first_albums.map{|x| x.values}.should == [middle_album, diff_album].map{|x| x.values}
|
122
|
+
|
123
|
+
ars = ds.eager_graph_with_options(:last_two_albums, limit_strategy).all
|
124
|
+
ars.should == [@artist, ar]
|
125
|
+
ars.first.last_two_albums.should == [diff_album, middle_album]
|
126
|
+
ars.last.last_two_albums.should == []
|
127
|
+
ars.first.last_two_albums.map{|x| x.values}.should == [diff_album, middle_album].map{|x| x.values}
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
shared_examples_for "one_through_one eager limit strategies" do
|
132
|
+
specify "should correctly handle offsets when eager loading one_through_one associations" do
|
133
|
+
Album.one_through_one :first_tag, {:clone=>:first_tag}.merge(@els) if @els
|
134
|
+
Album.one_through_one :second_tag, {:clone=>:second_tag}.merge(@els) if @els
|
135
|
+
Album.one_through_one :last_tag, {:clone=>:last_tag}.merge(@els) if @els
|
136
|
+
tu, tv = @other_tags.call
|
137
|
+
al = @pr.call.first
|
138
|
+
|
139
|
+
als = Album.eager(:first_tag, :second_tag, :last_tag).order(:name).all
|
140
|
+
als.should == [@album, al]
|
141
|
+
als.first.first_tag.should == @tag
|
142
|
+
als.first.second_tag.should == tu
|
143
|
+
als.first.last_tag.should == tv
|
144
|
+
als.last.first_tag.should == nil
|
145
|
+
als.last.second_tag.should == nil
|
146
|
+
als.last.last_tag.should == nil
|
147
|
+
|
148
|
+
# Check that no extra columns got added by the eager loading
|
149
|
+
als.first.first_tag.values.should == @tag.values
|
150
|
+
als.first.second_tag.values.should == tu.values
|
151
|
+
als.first.last_tag.values.should == tv.values
|
152
|
+
end
|
153
|
+
|
154
|
+
specify "should correctly handle offsets when eager graphing one_through_one associations" do
|
155
|
+
tu, tv = @other_tags.call
|
156
|
+
al = @pr.call.first
|
157
|
+
ds = Album.order(:albums__name)
|
158
|
+
limit_strategy = {:limit_strategy=>@els[:eager_limit_strategy]}
|
159
|
+
|
160
|
+
als = ds.eager_graph_with_options(:first_tag, limit_strategy).all
|
161
|
+
als.should == [@album, al]
|
162
|
+
als.first.first_tag.should == @tag
|
163
|
+
als.last.first_tag.should == nil
|
164
|
+
als.first.first_tag.values.should == @tag.values
|
165
|
+
|
166
|
+
als = ds.eager_graph_with_options(:second_tag, limit_strategy).all
|
167
|
+
als.should == [@album, al]
|
168
|
+
als.first.second_tag.should == tu
|
169
|
+
als.last.second_tag.should == nil
|
170
|
+
als.first.second_tag.values.should == tu.values
|
171
|
+
|
172
|
+
als = ds.eager_graph_with_options(:last_tag, limit_strategy).all
|
173
|
+
als.should == [@album, al]
|
174
|
+
als.first.last_tag.should == tv
|
175
|
+
als.last.last_tag.should == nil
|
176
|
+
als.first.last_tag.values.should == tv.values
|
177
|
+
end
|
62
178
|
end
|
63
179
|
|
64
180
|
shared_examples_for "many_to_many eager limit strategies" do
|
@@ -69,6 +185,7 @@ shared_examples_for "many_to_many eager limit strategies" do
|
|
69
185
|
Album.send @many_to_many_method||:many_to_many, :last_two_tags, {:clone=>:last_two_tags}.merge(@els) if @els
|
70
186
|
tu, tv = @other_tags.call
|
71
187
|
al = @pr.call.first
|
188
|
+
al.add_tag(tu)
|
72
189
|
|
73
190
|
als = Album.eager(:first_two_tags, :second_two_tags, :not_first_tags, :last_two_tags).order(:name).all
|
74
191
|
als.should == [@album, al]
|
@@ -76,9 +193,9 @@ shared_examples_for "many_to_many eager limit strategies" do
|
|
76
193
|
als.first.second_two_tags.should == [tu, tv]
|
77
194
|
als.first.not_first_tags.should == [tu, tv]
|
78
195
|
als.first.last_two_tags.should == [tv, tu]
|
79
|
-
als.last.first_two_tags.should == []
|
196
|
+
als.last.first_two_tags.should == [tu]
|
80
197
|
als.last.second_two_tags.should == []
|
81
|
-
als.last.last_two_tags.should == []
|
198
|
+
als.last.last_two_tags.should == [tu]
|
82
199
|
|
83
200
|
# Check that no extra columns got added by the eager loading
|
84
201
|
als.first.first_two_tags.map{|x| x.values}.should == [@tag, tu].map{|x| x.values}
|
@@ -86,6 +203,38 @@ shared_examples_for "many_to_many eager limit strategies" do
|
|
86
203
|
als.first.not_first_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
87
204
|
als.first.last_two_tags.map{|x| x.values}.should == [tv, tu].map{|x| x.values}
|
88
205
|
end
|
206
|
+
|
207
|
+
specify "should correctly handle limits and offsets when eager loading many_to_many associations" do
|
208
|
+
tu, tv = @other_tags.call
|
209
|
+
al = @pr.call.first
|
210
|
+
al.add_tag(tu)
|
211
|
+
ds = Album.order(:albums__name)
|
212
|
+
limit_strategy = {:limit_strategy=>(@els||{})[:eager_limit_strategy]}
|
213
|
+
|
214
|
+
als = ds.eager_graph_with_options(:first_two_tags, limit_strategy).all
|
215
|
+
als.should == [@album, al]
|
216
|
+
als.first.first_two_tags.should == [@tag, tu]
|
217
|
+
als.last.first_two_tags.should == [tu]
|
218
|
+
als.first.first_two_tags.map{|x| x.values}.should == [@tag, tu].map{|x| x.values}
|
219
|
+
|
220
|
+
als = ds.eager_graph_with_options(:second_two_tags, limit_strategy).all
|
221
|
+
als.should == [@album, al]
|
222
|
+
als.first.second_two_tags.should == [tu, tv]
|
223
|
+
als.last.second_two_tags.should == []
|
224
|
+
als.first.second_two_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
225
|
+
|
226
|
+
als = ds.eager_graph_with_options(:not_first_tags, limit_strategy).all
|
227
|
+
als.should == [@album, al]
|
228
|
+
als.first.not_first_tags.should == [tu, tv]
|
229
|
+
als.last.not_first_tags.should == []
|
230
|
+
als.first.not_first_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
231
|
+
|
232
|
+
als = ds.eager_graph_with_options(:last_two_tags, limit_strategy).all
|
233
|
+
als.should == [@album, al]
|
234
|
+
als.first.last_two_tags.should == [tv, tu]
|
235
|
+
als.last.last_two_tags.should == [tu]
|
236
|
+
als.first.last_two_tags.map{|x| x.values}.should == [tv, tu].map{|x| x.values}
|
237
|
+
end
|
89
238
|
end
|
90
239
|
|
91
240
|
shared_examples_for "many_through_many eager limit strategies" do
|
@@ -96,7 +245,9 @@ shared_examples_for "many_through_many eager limit strategies" do
|
|
96
245
|
Artist.many_through_many :last_two_tags, {:clone=>:last_two_tags}.merge(@els) if @els
|
97
246
|
@album.update(:artist => @artist)
|
98
247
|
tu, tv = @other_tags.call
|
99
|
-
ar = @pr.call
|
248
|
+
al, ar, _ = @pr.call
|
249
|
+
al.update(:artist=>ar)
|
250
|
+
al.add_tag(tu)
|
100
251
|
|
101
252
|
ars = Artist.eager(:first_two_tags, :second_two_tags, :not_first_tags, :last_two_tags).order(:name).all
|
102
253
|
ars.should == [@artist, ar]
|
@@ -104,9 +255,10 @@ shared_examples_for "many_through_many eager limit strategies" do
|
|
104
255
|
ars.first.second_two_tags.should == [tu, tv]
|
105
256
|
ars.first.not_first_tags.should == [tu, tv]
|
106
257
|
ars.first.last_two_tags.should == [tv, tu]
|
107
|
-
ars.last.first_two_tags.should == []
|
258
|
+
ars.last.first_two_tags.should == [tu]
|
108
259
|
ars.last.second_two_tags.should == []
|
109
|
-
ars.last.
|
260
|
+
ars.last.not_first_tags.should == []
|
261
|
+
ars.last.last_two_tags.should == [tu]
|
110
262
|
|
111
263
|
# Check that no extra columns got added by the eager loading
|
112
264
|
ars.first.first_two_tags.map{|x| x.values}.should == [@tag, tu].map{|x| x.values}
|
@@ -114,23 +266,195 @@ shared_examples_for "many_through_many eager limit strategies" do
|
|
114
266
|
ars.first.not_first_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
115
267
|
ars.first.last_two_tags.map{|x| x.values}.should == [tv, tu].map{|x| x.values}
|
116
268
|
end
|
269
|
+
|
270
|
+
specify "should correctly handle limits and offsets when eager loading many_through_many associations" do
|
271
|
+
@album.update(:artist => @artist)
|
272
|
+
tu, tv = @other_tags.call
|
273
|
+
al, ar, _ = @pr.call
|
274
|
+
al.update(:artist=>ar)
|
275
|
+
al.add_tag(tu)
|
276
|
+
ds = Artist.order(:artists__name)
|
277
|
+
limit_strategy = {:limit_strategy=>@els[:eager_limit_strategy]}
|
278
|
+
|
279
|
+
ars = ds.eager_graph_with_options(:first_two_tags, limit_strategy).all
|
280
|
+
ars.should == [@artist, ar]
|
281
|
+
ars.first.first_two_tags.should == [@tag, tu]
|
282
|
+
ars.last.first_two_tags.should == [tu]
|
283
|
+
ars.first.first_two_tags.map{|x| x.values}.should == [@tag, tu].map{|x| x.values}
|
284
|
+
|
285
|
+
ars = ds.eager_graph_with_options(:second_two_tags, limit_strategy).all
|
286
|
+
ars.should == [@artist, ar]
|
287
|
+
ars.first.second_two_tags.should == [tu, tv]
|
288
|
+
ars.last.second_two_tags.should == []
|
289
|
+
ars.first.second_two_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
290
|
+
|
291
|
+
ars = ds.eager_graph_with_options(:not_first_tags, limit_strategy).all
|
292
|
+
ars.should == [@artist, ar]
|
293
|
+
ars.first.not_first_tags.should == [tu, tv]
|
294
|
+
ars.last.not_first_tags.should == []
|
295
|
+
ars.first.not_first_tags.map{|x| x.values}.should == [tu, tv].map{|x| x.values}
|
296
|
+
|
297
|
+
ars = ds.eager_graph_with_options(:last_two_tags, limit_strategy).all
|
298
|
+
ars.should == [@artist, ar]
|
299
|
+
ars.first.last_two_tags.should == [tv, tu]
|
300
|
+
ars.last.last_two_tags.should == [tu]
|
301
|
+
ars.first.last_two_tags.map{|x| x.values}.should == [tv, tu].map{|x| x.values}
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
shared_examples_for "one_through_many eager limit strategies" do
|
306
|
+
specify "should correctly handle offsets when eager loading one_through_many associations" do
|
307
|
+
Artist.one_through_many :first_tag, {:clone=>:first_tag}.merge(@els) if @els
|
308
|
+
Artist.one_through_many :second_tag, {:clone=>:second_tag}.merge(@els) if @els
|
309
|
+
Artist.one_through_many :last_tag, {:clone=>:last_tag}.merge(@els) if @els
|
310
|
+
@album.update(:artist => @artist)
|
311
|
+
tu, tv = @other_tags.call
|
312
|
+
al, ar, _ = @pr.call
|
313
|
+
al.update(:artist=>ar)
|
314
|
+
al.add_tag(tu)
|
315
|
+
|
316
|
+
ars = Artist.eager(:first_tag, :second_tag, :last_tag).order(:name).all
|
317
|
+
ars.should == [@artist, ar]
|
318
|
+
ars.first.first_tag.should == @tag
|
319
|
+
ars.first.second_tag.should == tu
|
320
|
+
ars.first.last_tag.should == tv
|
321
|
+
ars.last.first_tag.should == tu
|
322
|
+
ars.last.second_tag.should == nil
|
323
|
+
ars.last.last_tag.should == tu
|
324
|
+
|
325
|
+
# Check that no extra columns got added by the eager loading
|
326
|
+
ars.first.first_tag.values.should == @tag.values
|
327
|
+
ars.first.second_tag.values.should == tu.values
|
328
|
+
ars.first.last_tag.values.should == tv.values
|
329
|
+
end
|
330
|
+
|
331
|
+
specify "should correctly handle offsets when eager graphing one_through_many associations" do
|
332
|
+
@album.update(:artist => @artist)
|
333
|
+
tu, tv = @other_tags.call
|
334
|
+
al, ar, _ = @pr.call
|
335
|
+
al.update(:artist=>ar)
|
336
|
+
al.add_tag(tu)
|
337
|
+
ds = Artist.order(:artists__name)
|
338
|
+
limit_strategy = {:limit_strategy=>@els[:eager_limit_strategy]}
|
339
|
+
|
340
|
+
ars = ds.eager_graph_with_options(:first_tag, limit_strategy).all
|
341
|
+
ars.should == [@artist, ar]
|
342
|
+
ars.first.first_tag.should == @tag
|
343
|
+
ars.last.first_tag.should == tu
|
344
|
+
ars.first.first_tag.values.should == @tag.values
|
345
|
+
|
346
|
+
ars = ds.eager_graph_with_options(:second_tag, limit_strategy).all
|
347
|
+
ars.should == [@artist, ar]
|
348
|
+
ars.first.second_tag.should == tu
|
349
|
+
ars.last.second_tag.should == nil
|
350
|
+
ars.first.second_tag.values.should == tu.values
|
351
|
+
|
352
|
+
ars = ds.eager_graph_with_options(:last_tag, limit_strategy).all
|
353
|
+
ars.should == [@artist, ar]
|
354
|
+
ars.first.last_tag.should == tv
|
355
|
+
ars.last.last_tag.should == tu
|
356
|
+
ars.first.last_tag.values.should == tv.values
|
357
|
+
end
|
117
358
|
end
|
118
359
|
|
119
360
|
shared_examples_for "eager limit strategies" do
|
120
361
|
it_should_behave_like "one_to_one eager limit strategies"
|
121
362
|
it_should_behave_like "one_to_many eager limit strategies"
|
122
363
|
it_should_behave_like "many_to_many eager limit strategies"
|
364
|
+
it_should_behave_like "one_through_one eager limit strategies"
|
123
365
|
it_should_behave_like "many_through_many eager limit strategies"
|
366
|
+
it_should_behave_like "one_through_many eager limit strategies"
|
124
367
|
end
|
125
368
|
|
126
369
|
shared_examples_for "filtering/excluding by associations" do
|
370
|
+
specify "should handle association inner joins" do
|
371
|
+
@Artist.association_join(:albums).all.should == []
|
372
|
+
@Artist.association_join(:first_album).all.should == []
|
373
|
+
@Album.association_join(:artist).all.should == []
|
374
|
+
@Album.association_join(:tags).all.should == []
|
375
|
+
@Album.association_join(:alias_tags).all.should == []
|
376
|
+
@Tag.association_join(:albums).all.should == []
|
377
|
+
unless @no_many_through_many
|
378
|
+
@Artist.association_join(:tags).all.should == []
|
379
|
+
@Artist.association_join(:first_tag).all.should == []
|
380
|
+
end
|
381
|
+
|
382
|
+
@album.update(:artist => @artist)
|
383
|
+
@album.add_tag(@tag)
|
384
|
+
|
385
|
+
@Artist.association_join(:albums).select_all(:artists).all.should == [@artist]
|
386
|
+
@Artist.association_join(:first_album).select_all(:artists).all.should == [@artist]
|
387
|
+
@Album.association_join(:artist).select_all(:albums).all.should == [@album]
|
388
|
+
@Album.association_join(:tags).select_all(:albums).all.should == [@album]
|
389
|
+
@Album.association_join(:alias_tags).select_all(:albums).all.should == [@album]
|
390
|
+
@Tag.association_join(:albums).select_all(:tags).all.should == [@tag]
|
391
|
+
unless @no_many_through_many
|
392
|
+
@Artist.association_join(:tags).select_all(:artists).all.should == [@artist]
|
393
|
+
@Artist.association_join(:first_tag).select_all(:artists).all.should == [@artist]
|
394
|
+
end
|
395
|
+
|
396
|
+
@Artist.association_join(:albums).select_all(:albums).naked.all.should == [@album.values]
|
397
|
+
@Artist.association_join(:first_album).select_all(:first_album).naked.all.should == [@album.values]
|
398
|
+
@Album.association_join(:artist).select_all(:artist).naked.all.should == [@artist.values]
|
399
|
+
@Album.association_join(:tags).select_all(:tags).naked.all.should == [@tag.values]
|
400
|
+
@Album.association_join(:alias_tags).select_all(:alias_tags).naked.all.should == [@tag.values]
|
401
|
+
@Tag.association_join(:albums).select_all(:albums).naked.all.should == [@album.values]
|
402
|
+
unless @no_many_through_many
|
403
|
+
@Artist.association_join(:tags).select_all(:tags).naked.all.should == [@tag.values]
|
404
|
+
@Artist.association_join(:first_tag).select_all(:first_tag).naked.all.should == [@tag.values]
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
specify "should handle association left joins" do
|
409
|
+
@Artist.association_left_join(:albums).select_all(:artists).all.should == [@artist]
|
410
|
+
@Artist.association_left_join(:first_album).select_all(:artists).all.should == [@artist]
|
411
|
+
@Album.association_left_join(:artist).select_all(:albums).all.should == [@album]
|
412
|
+
@Album.association_left_join(:tags).select_all(:albums).all.should == [@album]
|
413
|
+
@Album.association_left_join(:alias_tags).select_all(:albums).all.should == [@album]
|
414
|
+
@Tag.association_left_join(:albums).select_all(:tags).all.should == [@tag]
|
415
|
+
unless @no_many_through_many
|
416
|
+
@Artist.association_left_join(:tags).select_all(:artists).all.should == [@artist]
|
417
|
+
@Artist.association_left_join(:first_tag).select_all(:artists).all.should == [@artist]
|
418
|
+
end
|
419
|
+
|
420
|
+
nil_hash = lambda{|obj| [obj.values.keys.inject({}){|h,k| h[k] = nil; h}]}
|
421
|
+
@Artist.association_left_join(:albums).select_all(:albums).naked.all.should == nil_hash[@album]
|
422
|
+
@Artist.association_left_join(:first_album).select_all(:first_album).naked.all.should == nil_hash[@album]
|
423
|
+
@Album.association_left_join(:artist).select_all(:artist).naked.all.should == nil_hash[@artist]
|
424
|
+
@Album.association_left_join(:tags).select_all(:tags).naked.all.should == nil_hash[@tag]
|
425
|
+
@Album.association_left_join(:alias_tags).select_all(:alias_tags).naked.all.should == nil_hash[@tag]
|
426
|
+
@Tag.association_left_join(:albums).select_all(:albums).naked.all.should == nil_hash[@album]
|
427
|
+
unless @no_many_through_many
|
428
|
+
@Artist.association_left_join(:tags).select_all(:tags).naked.all.should == nil_hash[@tag]
|
429
|
+
@Artist.association_left_join(:first_tag).select_all(:first_tag).naked.all.should == nil_hash[@tag]
|
430
|
+
end
|
431
|
+
|
432
|
+
@album.update(:artist => @artist)
|
433
|
+
@album.add_tag(@tag)
|
434
|
+
|
435
|
+
|
436
|
+
@Artist.association_left_join(:albums).select_all(:albums).naked.all.should == [@album.values]
|
437
|
+
@Artist.association_left_join(:first_album).select_all(:first_album).naked.all.should == [@album.values]
|
438
|
+
@Album.association_left_join(:artist).select_all(:artist).naked.all.should == [@artist.values]
|
439
|
+
@Album.association_left_join(:tags).select_all(:tags).naked.all.should == [@tag.values]
|
440
|
+
@Album.association_left_join(:alias_tags).select_all(:alias_tags).naked.all.should == [@tag.values]
|
441
|
+
@Tag.association_left_join(:albums).select_all(:albums).naked.all.should == [@album.values]
|
442
|
+
unless @no_many_through_many
|
443
|
+
@Artist.association_left_join(:tags).select_all(:tags).naked.all.should == [@tag.values]
|
444
|
+
@Artist.association_left_join(:first_tag).select_all(:first_tag).naked.all.should == [@tag.values]
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
127
448
|
specify "should work correctly when filtering by associations" do
|
128
449
|
@album.update(:artist => @artist)
|
129
450
|
@album.add_tag(@tag)
|
130
451
|
|
131
452
|
@Artist.filter(:albums=>@album).all.should == [@artist]
|
132
453
|
@Artist.filter(:first_album=>@album).all.should == [@artist]
|
133
|
-
|
454
|
+
unless @no_many_through_many
|
455
|
+
@Artist.filter(:tags=>@tag).all.should == [@artist]
|
456
|
+
@Artist.filter(:first_tag=>@tag).all.should == [@artist]
|
457
|
+
end
|
134
458
|
@Album.filter(:artist=>@artist).all.should == [@album]
|
135
459
|
@Album.filter(:tags=>@tag).all.should == [@album]
|
136
460
|
@Album.filter(:alias_tags=>@tag).all.should == [@album]
|
@@ -146,7 +470,10 @@ shared_examples_for "filtering/excluding by associations" do
|
|
146
470
|
|
147
471
|
@Artist.exclude(:albums=>@album).all.should == [artist]
|
148
472
|
@Artist.exclude(:first_album=>@album).all.should == [artist]
|
149
|
-
|
473
|
+
unless @no_many_through_many
|
474
|
+
@Artist.exclude(:tags=>@tag).all.should == [artist]
|
475
|
+
@Artist.exclude(:first_tag=>@tag).all.should == [artist]
|
476
|
+
end
|
150
477
|
@Album.exclude(:artist=>@artist).all.should == [album]
|
151
478
|
@Album.exclude(:tags=>@tag).all.should == [album]
|
152
479
|
@Album.exclude(:alias_tags=>@tag).all.should == [album]
|
@@ -170,11 +497,21 @@ shared_examples_for "filtering/excluding by associations" do
|
|
170
497
|
|
171
498
|
@Album.filter(:t_tags=>@tag).all.should == [@album]
|
172
499
|
@Album.filter(:alias_t_tags=>@tag).all.should == [@album]
|
173
|
-
|
500
|
+
unless @no_many_through_many
|
501
|
+
@Album.filter(:t_tag=>@tag).all.should == [@album]
|
502
|
+
@Album.filter(:alias_t_tag=>@tag).all.should == [@album]
|
503
|
+
@Artist.filter(:t_tags=>@tag).all.should == [@artist]
|
504
|
+
@Artist.filter(:t_tag=>@tag).all.should == [@artist]
|
505
|
+
end
|
174
506
|
@tag.update(:name=>'Foo')
|
175
507
|
@Album.filter(:t_tags=>@tag).all.should == []
|
176
508
|
@Album.filter(:alias_t_tags=>@tag).all.should == []
|
177
|
-
|
509
|
+
unless @no_many_through_many
|
510
|
+
@Album.filter(:t_tag=>@tag).all.should == []
|
511
|
+
@Album.filter(:alias_t_tag=>@tag).all.should == []
|
512
|
+
@Artist.filter(:t_tags=>@tag).all.should == []
|
513
|
+
@Artist.filter(:t_tag=>@tag).all.should == []
|
514
|
+
end
|
178
515
|
end
|
179
516
|
|
180
517
|
specify "should work correctly when excluding by associations with conditions" do
|
@@ -193,11 +530,21 @@ shared_examples_for "filtering/excluding by associations" do
|
|
193
530
|
|
194
531
|
@Album.exclude(:t_tags=>@tag).all.should == []
|
195
532
|
@Album.exclude(:alias_t_tags=>@tag).all.should == []
|
196
|
-
|
533
|
+
unless @no_many_through_many
|
534
|
+
@Album.exclude(:t_tag=>@tag).all.should == []
|
535
|
+
@Album.exclude(:alias_t_tag=>@tag).all.should == []
|
536
|
+
@Artist.exclude(:t_tags=>@tag).all.should == []
|
537
|
+
@Artist.exclude(:t_tag=>@tag).all.should == []
|
538
|
+
end
|
197
539
|
@tag.update(:name=>'Foo')
|
198
540
|
@Album.exclude(:t_tags=>@tag).all.should == [@album]
|
199
541
|
@Album.exclude(:alias_t_tags=>@tag).all.should == [@album]
|
200
|
-
|
542
|
+
unless @no_many_through_many
|
543
|
+
@Album.exclude(:t_tag=>@tag).all.should == [@album]
|
544
|
+
@Album.exclude(:alias_t_tag=>@tag).all.should == [@album]
|
545
|
+
@Artist.exclude(:t_tags=>@tag).all.should == [@artist]
|
546
|
+
@Artist.exclude(:t_tag=>@tag).all.should == [@artist]
|
547
|
+
end
|
201
548
|
end
|
202
549
|
|
203
550
|
specify "should work correctly when filtering by multiple associations" do
|
@@ -213,7 +560,10 @@ shared_examples_for "filtering/excluding by associations" do
|
|
213
560
|
@Tag.filter(:albums=>[@album, album]).all.should == [@tag]
|
214
561
|
@Album.filter(:artist=>[@artist, artist], :tags=>[@tag, tag]).all.should == [@album]
|
215
562
|
@artist.albums_dataset.filter(:tags=>[@tag, tag]).all.should == [@album]
|
216
|
-
|
563
|
+
unless @no_many_through_many
|
564
|
+
@Artist.filter(:tags=>[@tag, tag]).all.should == [@artist]
|
565
|
+
@Artist.filter(:first_tag=>[@tag, tag]).all.should == [@artist]
|
566
|
+
end
|
217
567
|
|
218
568
|
album.add_tag(tag)
|
219
569
|
|
@@ -224,7 +574,10 @@ shared_examples_for "filtering/excluding by associations" do
|
|
224
574
|
@Album.filter(:alias_tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
225
575
|
@Tag.filter(:albums=>[@album, album]).all.sort_by{|x| x.pk}.should == [@tag, tag]
|
226
576
|
@Album.filter(:artist=>[@artist, artist], :tags=>[@tag, tag]).all.should == [@album]
|
227
|
-
|
577
|
+
unless @no_many_through_many
|
578
|
+
@Artist.filter(:tags=>[@tag, tag]).all.should == [@artist]
|
579
|
+
@Artist.filter(:first_tag=>[@tag, tag]).all.should == [@artist]
|
580
|
+
end
|
228
581
|
|
229
582
|
album.update(:artist => artist)
|
230
583
|
|
@@ -235,7 +588,10 @@ shared_examples_for "filtering/excluding by associations" do
|
|
235
588
|
@Album.filter(:alias_tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
236
589
|
@Tag.filter(:albums=>[@album, album]).all.sort_by{|x| x.pk}.should == [@tag, tag]
|
237
590
|
@Album.filter(:artist=>[@artist, artist], :tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
238
|
-
|
591
|
+
unless @no_many_through_many
|
592
|
+
@Artist.filter(:tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
593
|
+
@Artist.filter(:first_tag=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
594
|
+
end
|
239
595
|
end
|
240
596
|
|
241
597
|
specify "should work correctly when excluding by multiple associations" do
|
@@ -248,7 +604,10 @@ shared_examples_for "filtering/excluding by associations" do
|
|
248
604
|
@Album.exclude(:alias_tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
249
605
|
@Tag.exclude(:albums=>[@album, album]).all.sort_by{|x| x.pk}.should == [@tag, tag]
|
250
606
|
@Album.exclude(:artist=>[@artist, artist], :tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
251
|
-
|
607
|
+
unless @no_many_through_many
|
608
|
+
@Artist.exclude(:tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
609
|
+
@Artist.exclude(:first_tag=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
610
|
+
end
|
252
611
|
|
253
612
|
@album.update(:artist => @artist)
|
254
613
|
@album.add_tag(@tag)
|
@@ -260,7 +619,10 @@ shared_examples_for "filtering/excluding by associations" do
|
|
260
619
|
@Album.exclude(:alias_tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [album]
|
261
620
|
@Tag.exclude(:albums=>[@album, album]).all.sort_by{|x| x.pk}.should == [tag]
|
262
621
|
@Album.exclude(:artist=>[@artist, artist], :tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [album]
|
263
|
-
|
622
|
+
unless @no_many_through_many
|
623
|
+
@Artist.exclude(:tags=>[@tag, tag]).all.should == [artist]
|
624
|
+
@Artist.exclude(:first_tag=>[@tag, tag]).all.should == [artist]
|
625
|
+
end
|
264
626
|
|
265
627
|
album.add_tag(tag)
|
266
628
|
|
@@ -271,7 +633,10 @@ shared_examples_for "filtering/excluding by associations" do
|
|
271
633
|
@Album.exclude(:alias_tags=>[@tag, tag]).all.should == []
|
272
634
|
@Tag.exclude(:albums=>[@album, album]).all.should == []
|
273
635
|
@Album.exclude(:artist=>[@artist, artist], :tags=>[@tag, tag]).all.should == [album]
|
274
|
-
|
636
|
+
unless @no_many_through_many
|
637
|
+
@Artist.exclude(:tags=>[@tag, tag]).all.should == [artist]
|
638
|
+
@Artist.exclude(:first_tag=>[@tag, tag]).all.should == [artist]
|
639
|
+
end
|
275
640
|
|
276
641
|
album.update(:artist => artist)
|
277
642
|
|
@@ -282,7 +647,10 @@ shared_examples_for "filtering/excluding by associations" do
|
|
282
647
|
@Album.exclude(:alias_tags=>[@tag, tag]).all.should == []
|
283
648
|
@Tag.exclude(:albums=>[@album, album]).all.should == []
|
284
649
|
@Album.exclude(:artist=>[@artist, artist], :tags=>[@tag, tag]).all.should == []
|
285
|
-
|
650
|
+
unless @no_many_through_many
|
651
|
+
@Artist.exclude(:tags=>[@tag, tag]).all.should == []
|
652
|
+
@Artist.exclude(:first_tag=>[@tag, tag]).all.should == []
|
653
|
+
end
|
286
654
|
end
|
287
655
|
|
288
656
|
specify "should work correctly when filtering associations with conditions with multiple objects" do
|
@@ -315,15 +683,30 @@ shared_examples_for "filtering/excluding by associations" do
|
|
315
683
|
|
316
684
|
@Album.filter(:t_tags=>[@tag, tag]).all.should == [@album]
|
317
685
|
@Album.filter(:alias_t_tags=>[@tag, tag]).all.should == [@album]
|
318
|
-
|
686
|
+
unless @no_many_through_many
|
687
|
+
@Album.filter(:t_tag=>[@tag, tag]).all.should == [@album]
|
688
|
+
@Album.filter(:alias_t_tag=>[@tag, tag]).all.should == [@album]
|
689
|
+
@Artist.filter(:t_tags=>[@tag, tag]).all.should == [artist]
|
690
|
+
@Artist.filter(:t_tag=>[@tag, tag]).all.should == [artist]
|
691
|
+
end
|
319
692
|
@tag.update(:name=>'Foo')
|
320
693
|
@Album.filter(:t_tags=>[@tag, tag]).all.should == [@album]
|
321
694
|
@Album.filter(:alias_t_tags=>[@tag, tag]).all.should == [@album]
|
322
|
-
|
695
|
+
unless @no_many_through_many
|
696
|
+
@Album.filter(:t_tag=>[@tag, tag]).all.should == [@album]
|
697
|
+
@Album.filter(:alias_t_tag=>[@tag, tag]).all.should == [@album]
|
698
|
+
@Artist.filter(:t_tags=>[@tag, tag]).all.should == [artist]
|
699
|
+
@Artist.filter(:t_tag=>[@tag, tag]).all.should == [artist]
|
700
|
+
end
|
323
701
|
tag.update(:name=>'Foo')
|
324
702
|
@Album.filter(:t_tags=>[@tag, tag]).all.should == []
|
325
703
|
@Album.filter(:alias_t_tags=>[@tag, tag]).all.should == []
|
326
|
-
|
704
|
+
unless @no_many_through_many
|
705
|
+
@Album.filter(:t_tag=>[@tag, tag]).all.should == []
|
706
|
+
@Album.filter(:alias_t_tag=>[@tag, tag]).all.should == []
|
707
|
+
@Artist.filter(:t_tags=>[@tag, tag]).all.should == []
|
708
|
+
@Artist.filter(:t_tag=>[@tag, tag]).all.should == []
|
709
|
+
end
|
327
710
|
end
|
328
711
|
|
329
712
|
specify "should work correctly when excluding associations with conditions with multiple objects" do
|
@@ -357,15 +740,30 @@ shared_examples_for "filtering/excluding by associations" do
|
|
357
740
|
@tag.add_album(album)
|
358
741
|
@Album.exclude(:t_tags=>[@tag, tag]).all.should == []
|
359
742
|
@Album.exclude(:alias_t_tags=>[@tag, tag]).all.should == []
|
360
|
-
|
743
|
+
unless @no_many_through_many
|
744
|
+
@Album.exclude(:t_tag=>[@tag, tag]).all.should == []
|
745
|
+
@Album.exclude(:alias_t_tag=>[@tag, tag]).all.should == []
|
746
|
+
@Artist.exclude(:t_tags=>[@tag, tag]).all.should == [@artist]
|
747
|
+
@Artist.exclude(:t_tag=>[@tag, tag]).all.should == [@artist]
|
748
|
+
end
|
361
749
|
@tag.update(:name=>'Foo')
|
362
750
|
@Album.exclude(:t_tags=>[@tag, tag]).all.should == [album]
|
363
751
|
@Album.exclude(:alias_t_tags=>[@tag, tag]).all.should == [album]
|
364
|
-
|
752
|
+
unless @no_many_through_many
|
753
|
+
@Album.exclude(:t_tag=>[@tag, tag]).all.should == [album]
|
754
|
+
@Album.exclude(:alias_t_tag=>[@tag, tag]).all.should == [album]
|
755
|
+
@Artist.exclude(:t_tags=>[@tag, tag]).all.should == [@artist]
|
756
|
+
@Artist.exclude(:t_tag=>[@tag, tag]).all.should == [@artist]
|
757
|
+
end
|
365
758
|
tag.update(:name=>'Foo')
|
366
759
|
@Album.exclude(:t_tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
367
760
|
@Album.exclude(:alias_t_tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
368
|
-
|
761
|
+
unless @no_many_through_many
|
762
|
+
@Album.exclude(:t_tag=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
763
|
+
@Album.exclude(:alias_t_tag=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@album, album]
|
764
|
+
@Artist.exclude(:t_tags=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
765
|
+
@Artist.exclude(:t_tag=>[@tag, tag]).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
766
|
+
end
|
369
767
|
end
|
370
768
|
|
371
769
|
specify "should work correctly when excluding by associations in regards to NULL values" do
|
@@ -382,7 +780,12 @@ shared_examples_for "filtering/excluding by associations" do
|
|
382
780
|
@Album.exclude(:a_artist=>@artist).all.should == [@album]
|
383
781
|
@Album.exclude(:t_tags=>@tag).all.should == [@album]
|
384
782
|
@Album.exclude(:alias_t_tags=>@tag).all.should == [@album]
|
385
|
-
|
783
|
+
unless @no_many_through_many
|
784
|
+
@Album.exclude(:t_tag=>@tag).all.should == [@album]
|
785
|
+
@Album.exclude(:alias_t_tag=>@tag).all.should == [@album]
|
786
|
+
@Artist.exclude(:t_tags=>@tag).all.should == [@artist]
|
787
|
+
@Artist.exclude(:t_tag=>@tag).all.should == [@artist]
|
788
|
+
end
|
386
789
|
|
387
790
|
@album.update(:artist => @artist)
|
388
791
|
@artist.albums_dataset.exclude(:tags=>@tag).all.should == [@album]
|
@@ -440,6 +843,9 @@ shared_examples_for "filtering/excluding by associations" do
|
|
440
843
|
@Artist.filter(:tags=>@Tag).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
441
844
|
@Artist.filter(:tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [artist]
|
442
845
|
@Artist.filter(:tags=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
846
|
+
@Artist.filter(:first_tag=>@Tag).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
847
|
+
@Artist.filter(:first_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [artist]
|
848
|
+
@Artist.filter(:first_tag=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
443
849
|
end
|
444
850
|
end
|
445
851
|
|
@@ -473,6 +879,9 @@ shared_examples_for "filtering/excluding by associations" do
|
|
473
879
|
@Artist.exclude(:tags=>@Tag).all.sort_by{|x| x.pk}.should == []
|
474
880
|
@Artist.exclude(:tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [@artist]
|
475
881
|
@Artist.exclude(:tags=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
882
|
+
@Artist.exclude(:first_tag=>@Tag).all.sort_by{|x| x.pk}.should == []
|
883
|
+
@Artist.exclude(:first_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [@artist]
|
884
|
+
@Artist.exclude(:first_tag=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
476
885
|
end
|
477
886
|
end
|
478
887
|
|
@@ -488,7 +897,12 @@ shared_examples_for "filtering/excluding by associations" do
|
|
488
897
|
@Album.filter(:a_artist=>@Artist).all.sort_by{|x| x.pk}.should == [@album]
|
489
898
|
@Album.filter(:t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [@album]
|
490
899
|
@Album.filter(:alias_t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [@album]
|
491
|
-
|
900
|
+
unless @no_many_through_many
|
901
|
+
@Album.filter(:t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [@album]
|
902
|
+
@Album.filter(:alias_t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [@album]
|
903
|
+
@Artist.filter(:t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [@artist]
|
904
|
+
@Artist.filter(:t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [@artist]
|
905
|
+
end
|
492
906
|
|
493
907
|
artist.update(:name=>@artist.name)
|
494
908
|
album.update(:name=>@album.name)
|
@@ -499,14 +913,24 @@ shared_examples_for "filtering/excluding by associations" do
|
|
499
913
|
@Album.filter(:a_artist=>@Artist).all.sort_by{|x| x.pk}.should == [@album, album]
|
500
914
|
@Album.filter(:t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [@album, album]
|
501
915
|
@Album.filter(:alias_t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [@album, album]
|
502
|
-
|
916
|
+
unless @no_many_through_many
|
917
|
+
@Album.filter(:t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [@album, album]
|
918
|
+
@Album.filter(:alias_t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [@album, album]
|
919
|
+
@Artist.filter(:t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
920
|
+
@Artist.filter(:t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
921
|
+
end
|
503
922
|
|
504
923
|
@Artist.filter(:a_albums=>@Album.filter(Array(Album.primary_key).map{|k| Sequel.qualify(Album.table_name, k)}.zip(Array(album.pk)))).all.sort_by{|x| x.pk}.should == [artist]
|
505
924
|
@Artist.filter(:first_a_album=>@Album.filter(Array(Album.primary_key).map{|k| Sequel.qualify(Album.table_name, k)}.zip(Array(album.pk)))).all.sort_by{|x| x.pk}.should == [artist]
|
506
925
|
@Album.filter(:a_artist=>@Artist.filter(Array(Artist.primary_key).map{|k| Sequel.qualify(Artist.table_name, k)}.zip(Array(artist.pk)))).all.sort_by{|x| x.pk}.should == [album]
|
507
926
|
@Album.filter(:t_tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [album]
|
508
927
|
@Album.filter(:alias_t_tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [album]
|
509
|
-
|
928
|
+
unless @no_many_through_many
|
929
|
+
@Album.filter(:t_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [album]
|
930
|
+
@Album.filter(:alias_t_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [album]
|
931
|
+
@Artist.filter(:t_tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [artist]
|
932
|
+
@Artist.filter(:t_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [artist]
|
933
|
+
end
|
510
934
|
|
511
935
|
@Artist.filter(:a_albums=>@Album.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
512
936
|
@Artist.filter(:first_a_album=>@Album.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
@@ -514,7 +938,13 @@ shared_examples_for "filtering/excluding by associations" do
|
|
514
938
|
@Album.filter(:t_tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [album]
|
515
939
|
@Album.filter(:t_tags=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
516
940
|
@Album.filter(:alias_t_tags=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
517
|
-
|
941
|
+
unless @no_many_through_many
|
942
|
+
@Album.filter(:t_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [album]
|
943
|
+
@Album.filter(:t_tag=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
944
|
+
@Album.filter(:alias_t_tag=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
945
|
+
@Artist.filter(:t_tags=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
946
|
+
@Artist.filter(:t_tag=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == []
|
947
|
+
end
|
518
948
|
end
|
519
949
|
|
520
950
|
specify "should work correctly when excluding by association datasets with conditions" do
|
@@ -529,7 +959,12 @@ shared_examples_for "filtering/excluding by associations" do
|
|
529
959
|
@Album.exclude(:a_artist=>@Artist).all.sort_by{|x| x.pk}.should == [album]
|
530
960
|
@Album.exclude(:t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [album]
|
531
961
|
@Album.exclude(:alias_t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [album]
|
532
|
-
|
962
|
+
unless @no_many_through_many
|
963
|
+
@Album.exclude(:t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [album]
|
964
|
+
@Album.exclude(:alias_t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [album]
|
965
|
+
@Artist.exclude(:t_tags=>@Tag).all.sort_by{|x| x.pk}.should == [artist]
|
966
|
+
@Artist.exclude(:t_tag=>@Tag).all.sort_by{|x| x.pk}.should == [artist]
|
967
|
+
end
|
533
968
|
|
534
969
|
artist.update(:name=>@artist.name)
|
535
970
|
album.update(:name=>@album.name)
|
@@ -540,23 +975,472 @@ shared_examples_for "filtering/excluding by associations" do
|
|
540
975
|
@Album.exclude(:a_artist=>@Artist).all.sort_by{|x| x.pk}.should == []
|
541
976
|
@Album.exclude(:t_tags=>@Tag).all.sort_by{|x| x.pk}.should == []
|
542
977
|
@Album.exclude(:alias_t_tags=>@Tag).all.sort_by{|x| x.pk}.should == []
|
543
|
-
|
978
|
+
unless @no_many_through_many
|
979
|
+
@Album.exclude(:t_tag=>@Tag).all.sort_by{|x| x.pk}.should == []
|
980
|
+
@Album.exclude(:alias_t_tag=>@Tag).all.sort_by{|x| x.pk}.should == []
|
981
|
+
@Artist.exclude(:t_tags=>@Tag).all.sort_by{|x| x.pk}.should == []
|
982
|
+
@Artist.exclude(:t_tag=>@Tag).all.sort_by{|x| x.pk}.should == []
|
983
|
+
end
|
544
984
|
|
545
985
|
@Artist.exclude(:a_albums=>@Album.filter(Array(Album.primary_key).map{|k| Sequel.qualify(Album.table_name, k)}.zip(Array(album.pk)))).all.sort_by{|x| x.pk}.should == [@artist]
|
546
986
|
@Artist.exclude(:first_a_album=>@Album.filter(Array(Album.primary_key).map{|k| Sequel.qualify(Album.table_name, k)}.zip(Array(album.pk)))).all.sort_by{|x| x.pk}.should == [@artist]
|
547
987
|
@Album.exclude(:a_artist=>@Artist.filter(Array(Artist.primary_key).map{|k| Sequel.qualify(Artist.table_name, k)}.zip(Array(artist.pk)))).all.sort_by{|x| x.pk}.should == [@album]
|
548
988
|
@Album.exclude(:t_tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [@album]
|
549
989
|
@Album.exclude(:alias_t_tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [@album]
|
550
|
-
|
990
|
+
unless @no_many_through_many
|
991
|
+
@Album.exclude(:t_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [@album]
|
992
|
+
@Album.exclude(:alias_t_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [@album]
|
993
|
+
@Artist.exclude(:t_tags=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [@artist]
|
994
|
+
@Artist.exclude(:t_tag=>@Tag.filter(Array(Tag.primary_key).map{|k| Sequel.qualify(Tag.table_name, k)}.zip(Array(tag.pk)))).all.sort_by{|x| x.pk}.should == [@artist]
|
995
|
+
end
|
551
996
|
|
552
997
|
@Artist.exclude(:a_albums=>@Album.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
553
998
|
@Artist.exclude(:first_a_album=>@Album.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
554
999
|
@Album.exclude(:a_artist=>@Artist.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@album, album]
|
555
1000
|
@Album.exclude(:t_tags=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@album, album]
|
556
1001
|
@Album.exclude(:alias_t_tags=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@album, album]
|
557
|
-
|
1002
|
+
unless @no_many_through_many
|
1003
|
+
@Album.exclude(:t_tag=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@album, album]
|
1004
|
+
@Album.exclude(:alias_t_tag=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@album, album]
|
1005
|
+
@Artist.exclude(:t_tags=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
1006
|
+
@Artist.exclude(:t_tag=>@Tag.filter(1=>0)).all.sort_by{|x| x.pk}.should == [@artist, artist]
|
1007
|
+
end
|
558
1008
|
end
|
1009
|
+
end
|
559
1010
|
|
1011
|
+
shared_examples_for "filter by associations singular association limit strategies" do
|
1012
|
+
specify "filter by associations with limited one_to_one associations should work correctly" do
|
1013
|
+
Artist.one_to_one :first_album, {:clone=>:first_album}.merge(@els)
|
1014
|
+
Artist.one_to_one :last_album, {:clone=>:last_album}.merge(@els)
|
1015
|
+
Artist.one_to_one :second_album, {:clone=>:second_album}.merge(@els)
|
1016
|
+
@album.update(:artist => @artist)
|
1017
|
+
diff_album = @diff_album.call
|
1018
|
+
ar = @pr.call[1]
|
1019
|
+
ds = Artist.order(:name)
|
1020
|
+
|
1021
|
+
ds.where(:first_album=>@album).all.should == [@artist]
|
1022
|
+
ds.where(:first_album=>diff_album).all.should == []
|
1023
|
+
ds.exclude(:first_album=>@album).all.should == [ar]
|
1024
|
+
ds.exclude(:first_album=>diff_album).all.should == [@artist, ar]
|
1025
|
+
|
1026
|
+
ds.where(:second_album=>@album).all.should == []
|
1027
|
+
ds.where(:second_album=>diff_album).all.should == [@artist]
|
1028
|
+
ds.exclude(:second_album=>@album).all.should == [@artist, ar]
|
1029
|
+
ds.exclude(:second_album=>diff_album).all.should == [ar]
|
1030
|
+
|
1031
|
+
ds.where(:last_album=>@album).all.should == []
|
1032
|
+
ds.where(:last_album=>diff_album).all.should == [@artist]
|
1033
|
+
ds.exclude(:last_album=>@album).all.should == [@artist, ar]
|
1034
|
+
ds.exclude(:last_album=>diff_album).all.should == [ar]
|
1035
|
+
|
1036
|
+
Artist.one_to_one :first_album, :clone=>:first_album do |ads| ads.where(:albums__name=>diff_album.name) end
|
1037
|
+
ar.add_album(diff_album)
|
1038
|
+
ds.where(:first_album=>[@album, diff_album]).all.should == [ar]
|
1039
|
+
ds.exclude(:first_album=>[@album, diff_album]).all.should == [@artist]
|
1040
|
+
end
|
1041
|
+
|
1042
|
+
specify "dataset associations with limited one_to_one associations should work correctly" do
|
1043
|
+
Artist.one_to_one :first_album, {:clone=>:first_album}.merge(@els)
|
1044
|
+
Artist.one_to_one :last_album, {:clone=>:last_album}.merge(@els)
|
1045
|
+
Artist.one_to_one :second_album, {:clone=>:second_album}.merge(@els)
|
1046
|
+
@album.update(:artist => @artist)
|
1047
|
+
diff_album = @diff_album.call
|
1048
|
+
ar = @pr.call[1]
|
1049
|
+
ds = Artist
|
1050
|
+
|
1051
|
+
ds.where(@artist.pk_hash).first_albums.all.should == [@album]
|
1052
|
+
ds.where(@artist.pk_hash).second_albums.all.should == [diff_album]
|
1053
|
+
ds.where(@artist.pk_hash).last_albums.all.should == [diff_album]
|
1054
|
+
ds.where(ar.pk_hash).first_albums.all.should == []
|
1055
|
+
ds.where(ar.pk_hash).second_albums.all.should == []
|
1056
|
+
ds.where(ar.pk_hash).last_albums.all.should == []
|
1057
|
+
|
1058
|
+
Artist.one_to_one :first_album, :clone=>:first_album do |ads| ads.where(:albums__name=>diff_album.name) end
|
1059
|
+
ar.add_album(diff_album)
|
1060
|
+
ds.where(@artist.pk_hash).first_albums.all.should == []
|
1061
|
+
ds.where(ar.pk_hash).first_albums.all.should == [diff_album]
|
1062
|
+
end
|
1063
|
+
|
1064
|
+
specify "filter by associations with limited one_through_one associations should work correctly" do
|
1065
|
+
Album.one_through_one :first_tag, {:clone=>:first_tag}.merge(@els)
|
1066
|
+
Album.one_through_one :second_tag, {:clone=>:second_tag}.merge(@els)
|
1067
|
+
Album.one_through_one :last_tag, {:clone=>:last_tag}.merge(@els)
|
1068
|
+
tu, tv = @other_tags.call
|
1069
|
+
al = @pr.call.first
|
1070
|
+
ds = Album.order(:name)
|
1071
|
+
al.add_tag(tu)
|
1072
|
+
|
1073
|
+
ds.where(:first_tag=>@tag).all.should == [@album]
|
1074
|
+
ds.where(:first_tag=>tu).all.should == [al]
|
1075
|
+
ds.where(:first_tag=>tv).all.should == []
|
1076
|
+
ds.exclude(:first_tag=>@tag).all.should == [al]
|
1077
|
+
ds.exclude(:first_tag=>tu).all.should == [@album]
|
1078
|
+
ds.exclude(:first_tag=>tv).all.should == [@album, al]
|
1079
|
+
|
1080
|
+
ds.where(:second_tag=>@tag).all.should == []
|
1081
|
+
ds.where(:second_tag=>tu).all.should == [@album]
|
1082
|
+
ds.where(:second_tag=>tv).all.should == []
|
1083
|
+
ds.exclude(:second_tag=>@tag).all.should == [@album, al]
|
1084
|
+
ds.exclude(:second_tag=>tu).all.should == [al]
|
1085
|
+
ds.exclude(:second_tag=>tv).all.should == [@album, al]
|
1086
|
+
|
1087
|
+
ds.where(:last_tag=>@tag).all.should == []
|
1088
|
+
ds.where(:last_tag=>tu).all.should == [al]
|
1089
|
+
ds.where(:last_tag=>tv).all.should == [@album]
|
1090
|
+
ds.exclude(:last_tag=>@tag).all.should == [@album, al]
|
1091
|
+
ds.exclude(:last_tag=>tu).all.should == [@album]
|
1092
|
+
ds.exclude(:last_tag=>tv).all.should == [al]
|
1093
|
+
|
1094
|
+
Album.one_through_one :first_tag, :clone=>:first_tag do |ads| ads.where(:tags__name=>tu.name) end
|
1095
|
+
Album.one_through_one :second_tag, :clone=>:second_tag do |ads| ads.where(:tags__name=>[tu.name, tv.name]) end
|
1096
|
+
|
1097
|
+
ds.where(:first_tag=>[@tag, tu]).all.should == [@album, al]
|
1098
|
+
ds.exclude(:first_tag=>[@tag, tu]).all.should == []
|
1099
|
+
|
1100
|
+
al.add_tag(tv)
|
1101
|
+
ds.where(:second_tag=>[tv, tu]).all.should == [@album, al]
|
1102
|
+
ds.exclude(:second_tag=>[tv, tu]).all.should == []
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
specify "dataset associations with limited one_through_one associations should work correctly" do
|
1106
|
+
Album.one_through_one :first_tag, {:clone=>:first_tag}.merge(@els)
|
1107
|
+
Album.one_through_one :second_tag, {:clone=>:second_tag}.merge(@els)
|
1108
|
+
Album.one_through_one :last_tag, {:clone=>:last_tag}.merge(@els)
|
1109
|
+
tu, tv = @other_tags.call
|
1110
|
+
al = @pr.call.first
|
1111
|
+
ds = Album
|
1112
|
+
al.add_tag(tu)
|
1113
|
+
|
1114
|
+
ds.where(@album.pk_hash).first_tags.all.should == [@tag]
|
1115
|
+
ds.where(@album.pk_hash).second_tags.all.should == [tu]
|
1116
|
+
ds.where(@album.pk_hash).last_tags.all.should == [tv]
|
1117
|
+
ds.where(al.pk_hash).first_tags.all.should == [tu]
|
1118
|
+
ds.where(al.pk_hash).second_tags.all.should == []
|
1119
|
+
ds.where(al.pk_hash).last_tags.all.should == [tu]
|
1120
|
+
|
1121
|
+
Album.one_through_one :first_tag, :clone=>:first_tag do |ads| ads.where(:tags__name=>tu.name) end
|
1122
|
+
Album.one_through_one :second_tag, :clone=>:second_tag do |ads| ads.where(:tags__name=>[tu.name, tv.name]) end
|
1123
|
+
|
1124
|
+
ds.where(@album.pk_hash).first_tags.all.should == [tu]
|
1125
|
+
ds.where(@album.pk_hash).second_tags.all.should == [tv]
|
1126
|
+
ds.where(al.pk_hash).first_tags.all.should == [tu]
|
1127
|
+
ds.where(al.pk_hash).second_tags.all.should == []
|
1128
|
+
|
1129
|
+
al.add_tag(tv)
|
1130
|
+
ds.where(@album.pk_hash).first_tags.all.should == [tu]
|
1131
|
+
ds.where(@album.pk_hash).second_tags.all.should == [tv]
|
1132
|
+
ds.where(al.pk_hash).first_tags.all.should == [tu]
|
1133
|
+
ds.where(al.pk_hash).second_tags.all.should == [tv]
|
1134
|
+
end
|
1135
|
+
|
1136
|
+
specify "filter by associations with limited one_through_many associations should work correctly" do
|
1137
|
+
Artist.one_through_many :first_tag, {:clone=>:first_tag}.merge(@els)
|
1138
|
+
Artist.one_through_many :second_tag, {:clone=>:second_tag}.merge(@els)
|
1139
|
+
Artist.one_through_many :last_tag, {:clone=>:last_tag}.merge(@els)
|
1140
|
+
@album.update(:artist => @artist)
|
1141
|
+
tu, tv = @other_tags.call
|
1142
|
+
al, ar, _ = @pr.call
|
1143
|
+
al.update(:artist=>ar)
|
1144
|
+
al.add_tag(tu)
|
1145
|
+
ds = Artist.order(:name)
|
1146
|
+
|
1147
|
+
ds.where(:first_tag=>@tag).all.should == [@artist]
|
1148
|
+
ds.where(:first_tag=>tu).all.should == [ar]
|
1149
|
+
ds.where(:first_tag=>tv).all.should == []
|
1150
|
+
ds.exclude(:first_tag=>@tag).all.should == [ar]
|
1151
|
+
ds.exclude(:first_tag=>tu).all.should == [@artist]
|
1152
|
+
ds.exclude(:first_tag=>tv).all.should == [@artist, ar]
|
1153
|
+
|
1154
|
+
ds.where(:second_tag=>@tag).all.should == []
|
1155
|
+
ds.where(:second_tag=>tu).all.should == [@artist]
|
1156
|
+
ds.where(:second_tag=>tv).all.should == []
|
1157
|
+
ds.exclude(:second_tag=>@tag).all.should == [@artist, ar]
|
1158
|
+
ds.exclude(:second_tag=>tu).all.should == [ar]
|
1159
|
+
ds.exclude(:second_tag=>tv).all.should == [@artist, ar]
|
1160
|
+
|
1161
|
+
ds.where(:last_tag=>@tag).all.should == []
|
1162
|
+
ds.where(:last_tag=>tu).all.should == [ar]
|
1163
|
+
ds.where(:last_tag=>tv).all.should == [@artist]
|
1164
|
+
ds.exclude(:last_tag=>@tag).all.should == [@artist, ar]
|
1165
|
+
ds.exclude(:last_tag=>tu).all.should == [@artist]
|
1166
|
+
ds.exclude(:last_tag=>tv).all.should == [ar]
|
1167
|
+
|
1168
|
+
Artist.one_through_many :first_tag, :clone=>:first_tag do |ads| ads.where(:tags__name=>tu.name) end
|
1169
|
+
Artist.one_through_many :second_tag, :clone=>:second_tag do |ads| ads.where(:tags__name=>[tu.name, tv.name]) end
|
1170
|
+
|
1171
|
+
ds.where(:first_tag=>[@tag, tu]).all.should == [@artist, ar]
|
1172
|
+
ds.exclude(:first_tag=>[@tag, tu]).all.should == []
|
1173
|
+
|
1174
|
+
al.add_tag(tv)
|
1175
|
+
ds.where(:second_tag=>[tv, tu]).all.should == [@artist, ar]
|
1176
|
+
ds.exclude(:second_tag=>[tv, tu]).all.should == []
|
1177
|
+
end
|
1178
|
+
|
1179
|
+
specify "dataset associations with limited one_through_many associations should work correctly" do
|
1180
|
+
Artist.one_through_many :first_tag, {:clone=>:first_tag}.merge(@els)
|
1181
|
+
Artist.one_through_many :second_tag, {:clone=>:second_tag}.merge(@els)
|
1182
|
+
Artist.one_through_many :last_tag, {:clone=>:last_tag}.merge(@els)
|
1183
|
+
@album.update(:artist => @artist)
|
1184
|
+
tu, tv = @other_tags.call
|
1185
|
+
al, ar, _ = @pr.call
|
1186
|
+
al.update(:artist=>ar)
|
1187
|
+
al.add_tag(tu)
|
1188
|
+
ds = Artist.order(:name)
|
1189
|
+
|
1190
|
+
ds.where(@artist.pk_hash).first_tags.all.should == [@tag]
|
1191
|
+
ds.where(@artist.pk_hash).second_tags.all.should == [tu]
|
1192
|
+
ds.where(@artist.pk_hash).last_tags.all.should == [tv]
|
1193
|
+
ds.where(ar.pk_hash).first_tags.all.should == [tu]
|
1194
|
+
ds.where(ar.pk_hash).second_tags.all.should == []
|
1195
|
+
ds.where(ar.pk_hash).last_tags.all.should == [tu]
|
1196
|
+
|
1197
|
+
Artist.one_through_many :first_tag, :clone=>:first_tag do |ads| ads.where(:tags__name=>tu.name) end
|
1198
|
+
Artist.one_through_many :second_tag, :clone=>:second_tag do |ads| ads.where(:tags__name=>[tu.name, tv.name]) end
|
1199
|
+
|
1200
|
+
ds.where(@artist.pk_hash).first_tags.all.should == [tu]
|
1201
|
+
ds.where(@artist.pk_hash).second_tags.all.should == [tv]
|
1202
|
+
ds.where(ar.pk_hash).first_tags.all.should == [tu]
|
1203
|
+
ds.where(ar.pk_hash).second_tags.all.should == []
|
1204
|
+
|
1205
|
+
al.add_tag(tv)
|
1206
|
+
ds.where(@artist.pk_hash).first_tags.all.should == [tu]
|
1207
|
+
ds.where(@artist.pk_hash).second_tags.all.should == [tv]
|
1208
|
+
ds.where(ar.pk_hash).first_tags.all.should == [tu]
|
1209
|
+
ds.where(ar.pk_hash).second_tags.all.should == [tv]
|
1210
|
+
end
|
1211
|
+
end
|
1212
|
+
|
1213
|
+
shared_examples_for "filter by associations limit strategies" do
|
1214
|
+
it_should_behave_like "filter by associations singular association limit strategies"
|
1215
|
+
|
1216
|
+
specify "filter by associations with limited one_to_many associations should work correctly" do
|
1217
|
+
Artist.one_to_many :first_two_albums, {:clone=>:first_two_albums}.merge(@els)
|
1218
|
+
Artist.one_to_many :second_two_albums, {:clone=>:second_two_albums}.merge(@els)
|
1219
|
+
Artist.one_to_many :not_first_albums, {:clone=>:not_first_albums}.merge(@els)
|
1220
|
+
Artist.one_to_many :last_two_albums, {:clone=>:last_two_albums}.merge(@els)
|
1221
|
+
@album.update(:artist => @artist)
|
1222
|
+
middle_album = @middle_album.call
|
1223
|
+
diff_album = @diff_album.call
|
1224
|
+
ar = @pr.call[1]
|
1225
|
+
ds = Artist.order(:name)
|
1226
|
+
|
1227
|
+
ds.where(:first_two_albums=>@album).all.should == [@artist]
|
1228
|
+
ds.where(:first_two_albums=>middle_album).all.should == [@artist]
|
1229
|
+
ds.where(:first_two_albums=>diff_album).all.should == []
|
1230
|
+
ds.exclude(:first_two_albums=>@album).all.should == [ar]
|
1231
|
+
ds.exclude(:first_two_albums=>middle_album).all.should == [ar]
|
1232
|
+
ds.exclude(:first_two_albums=>diff_album).all.should == [@artist, ar]
|
1233
|
+
|
1234
|
+
[:second_two_albums, :not_first_albums, :last_two_albums].each do |a|
|
1235
|
+
ds.where(a=>@album).all.should == []
|
1236
|
+
ds.where(a=>middle_album).all.should == [@artist]
|
1237
|
+
ds.where(a=>diff_album).all.should == [@artist]
|
1238
|
+
ds.exclude(a=>@album).all.should == [@artist, ar]
|
1239
|
+
ds.exclude(a=>middle_album).all.should == [ar]
|
1240
|
+
ds.exclude(a=>diff_album).all.should == [ar]
|
1241
|
+
end
|
1242
|
+
|
1243
|
+
Artist.one_to_one :first_two_albums, :clone=>:first_two_albums do |ads| ads.where(:albums__name=>diff_album.name) end
|
1244
|
+
ar.add_album(diff_album)
|
1245
|
+
ds.where(:first_two_albums=>[@album, diff_album]).all.should == [ar]
|
1246
|
+
ds.exclude(:first_two_albums=>[@album, diff_album]).all.should == [@artist]
|
1247
|
+
end
|
1248
|
+
|
1249
|
+
specify "dataset associations with limited one_to_many associations should work correctly" do
|
1250
|
+
Artist.one_to_many :first_two_albums, {:clone=>:first_two_albums}.merge(@els)
|
1251
|
+
Artist.one_to_many :second_two_albums, {:clone=>:second_two_albums}.merge(@els)
|
1252
|
+
Artist.one_to_many :not_first_albums, {:clone=>:not_first_albums}.merge(@els)
|
1253
|
+
Artist.one_to_many :last_two_albums, {:clone=>:last_two_albums}.merge(@els)
|
1254
|
+
@album.update(:artist => @artist)
|
1255
|
+
middle_album = @middle_album.call
|
1256
|
+
diff_album = @diff_album.call
|
1257
|
+
ar = @pr.call[1]
|
1258
|
+
ds = Artist.order(:name)
|
1259
|
+
|
1260
|
+
ds.where(@artist.pk_hash).first_two_albums.all.should == [@album, middle_album]
|
1261
|
+
ds.where(@artist.pk_hash).second_two_albums.all.should == [middle_album, diff_album]
|
1262
|
+
ds.where(@artist.pk_hash).not_first_albums.all.should == [middle_album, diff_album]
|
1263
|
+
ds.where(@artist.pk_hash).last_two_albums.all.should == [diff_album, middle_album]
|
1264
|
+
ds.where(ar.pk_hash).first_two_albums.all.should == []
|
1265
|
+
ds.where(ar.pk_hash).second_two_albums.all.should == []
|
1266
|
+
ds.where(ar.pk_hash).not_first_albums.all.should == []
|
1267
|
+
ds.where(ar.pk_hash).last_two_albums.all.should == []
|
1268
|
+
|
1269
|
+
Artist.one_to_one :first_two_albums, :clone=>:first_two_albums do |ads| ads.where(:albums__name=>[diff_album.name, middle_album.name]) end
|
1270
|
+
ar.add_album(diff_album)
|
1271
|
+
ds.where(@artist.pk_hash).first_two_albums.all.should == [middle_album]
|
1272
|
+
ds.where(ar.pk_hash).first_two_albums.all.should == [diff_album]
|
1273
|
+
end
|
1274
|
+
|
1275
|
+
specify "filter by associations with limited many_to_many associations should work correctly" do
|
1276
|
+
Album.send :many_to_many, :first_two_tags, {:clone=>:first_two_tags}.merge(@els)
|
1277
|
+
Album.send :many_to_many, :second_two_tags, {:clone=>:second_two_tags}.merge(@els)
|
1278
|
+
Album.send :many_to_many, :not_first_tags, {:clone=>:not_first_tags}.merge(@els)
|
1279
|
+
Album.send :many_to_many, :last_two_tags, {:clone=>:last_two_tags}.merge(@els)
|
1280
|
+
tu, tv = @other_tags.call
|
1281
|
+
al = @pr.call.first
|
1282
|
+
al.add_tag(tu)
|
1283
|
+
ds = Album.order(:name)
|
1284
|
+
|
1285
|
+
ds.where(:first_two_tags=>@tag).all.should == [@album]
|
1286
|
+
ds.where(:first_two_tags=>tu).all.should == [@album, al]
|
1287
|
+
ds.where(:first_two_tags=>tv).all.should == []
|
1288
|
+
ds.exclude(:first_two_tags=>@tag).all.should == [al]
|
1289
|
+
ds.exclude(:first_two_tags=>tu).all.should == []
|
1290
|
+
ds.exclude(:first_two_tags=>tv).all.should == [@album, al]
|
1291
|
+
|
1292
|
+
ds.where(:second_two_tags=>@tag).all.should == []
|
1293
|
+
ds.where(:second_two_tags=>tu).all.should == [@album]
|
1294
|
+
ds.where(:second_two_tags=>tv).all.should == [@album]
|
1295
|
+
ds.exclude(:second_two_tags=>@tag).all.should == [@album, al]
|
1296
|
+
ds.exclude(:second_two_tags=>tu).all.should == [al]
|
1297
|
+
ds.exclude(:second_two_tags=>tv).all.should == [al]
|
1298
|
+
|
1299
|
+
ds.where(:not_first_tags=>@tag).all.should == []
|
1300
|
+
ds.where(:not_first_tags=>tu).all.should == [@album]
|
1301
|
+
ds.where(:not_first_tags=>tv).all.should == [@album]
|
1302
|
+
ds.exclude(:not_first_tags=>@tag).all.should == [@album, al]
|
1303
|
+
ds.exclude(:not_first_tags=>tu).all.should == [al]
|
1304
|
+
ds.exclude(:not_first_tags=>tv).all.should == [al]
|
1305
|
+
|
1306
|
+
ds.where(:last_two_tags=>@tag).all.should == []
|
1307
|
+
ds.where(:last_two_tags=>tu).all.should == [@album, al]
|
1308
|
+
ds.where(:last_two_tags=>tv).all.should == [@album]
|
1309
|
+
ds.exclude(:last_two_tags=>@tag).all.should == [@album, al]
|
1310
|
+
ds.exclude(:last_two_tags=>tu).all.should == []
|
1311
|
+
ds.exclude(:last_two_tags=>tv).all.should == [al]
|
1312
|
+
|
1313
|
+
Album.many_to_many :first_two_tags, :clone=>:first_two_tags do |ads| ads.where(:tags__name=>tu.name) end
|
1314
|
+
Album.many_to_many :second_two_tags, :clone=>:second_two_tags do |ads| ads.where(:tags__name=>[tu.name, tv.name]) end
|
1315
|
+
|
1316
|
+
ds.where(:first_two_tags=>[@tag, tu]).all.should == [@album, al]
|
1317
|
+
ds.exclude(:first_two_tags=>[@tag, tu]).all.should == []
|
1318
|
+
|
1319
|
+
al.add_tag(tv)
|
1320
|
+
ds.where(:second_two_tags=>[tv, tu]).all.should == [@album, al]
|
1321
|
+
ds.exclude(:second_two_tags=>[tv, tu]).all.should == []
|
1322
|
+
end
|
1323
|
+
|
1324
|
+
specify "dataset associations with limited many_to_many associations should work correctly" do
|
1325
|
+
Album.send :many_to_many, :first_two_tags, {:clone=>:first_two_tags}.merge(@els)
|
1326
|
+
Album.send :many_to_many, :second_two_tags, {:clone=>:second_two_tags}.merge(@els)
|
1327
|
+
Album.send :many_to_many, :not_first_tags, {:clone=>:not_first_tags}.merge(@els)
|
1328
|
+
Album.send :many_to_many, :last_two_tags, {:clone=>:last_two_tags}.merge(@els)
|
1329
|
+
tu, tv = @other_tags.call
|
1330
|
+
al = @pr.call.first
|
1331
|
+
al.add_tag(tu)
|
1332
|
+
ds = Album.order(:name)
|
1333
|
+
|
1334
|
+
ds.where(@album.pk_hash).first_two_tags.all.should == [@tag, tu]
|
1335
|
+
ds.where(@album.pk_hash).second_two_tags.all.should == [tu, tv]
|
1336
|
+
ds.where(@album.pk_hash).not_first_tags.all.should == [tu, tv]
|
1337
|
+
ds.where(@album.pk_hash).last_two_tags.all.should == [tv, tu]
|
1338
|
+
ds.where(al.pk_hash).first_two_tags.all.should == [tu]
|
1339
|
+
ds.where(al.pk_hash).second_two_tags.all.should == []
|
1340
|
+
ds.where(al.pk_hash).not_first_tags.all.should == []
|
1341
|
+
ds.where(al.pk_hash).last_two_tags.all.should == [tu]
|
1342
|
+
|
1343
|
+
Album.many_to_many :first_two_tags, :clone=>:first_two_tags do |ads| ads.where(:tags__name=>tu.name) end
|
1344
|
+
Album.many_to_many :second_two_tags, :clone=>:second_two_tags do |ads| ads.where(:tags__name=>[tu.name, tv.name]) end
|
1345
|
+
|
1346
|
+
ds.where(@album.pk_hash).first_two_tags.all.should == [tu]
|
1347
|
+
ds.where(@album.pk_hash).second_two_tags.all.should == [tv]
|
1348
|
+
ds.where(al.pk_hash).first_two_tags.all.should == [tu]
|
1349
|
+
ds.where(al.pk_hash).second_two_tags.all.should == []
|
1350
|
+
|
1351
|
+
al.add_tag(tv)
|
1352
|
+
ds.where(@album.pk_hash).first_two_tags.all.should == [tu]
|
1353
|
+
ds.where(@album.pk_hash).second_two_tags.all.should == [tv]
|
1354
|
+
ds.where(al.pk_hash).first_two_tags.all.should == [tu]
|
1355
|
+
ds.where(al.pk_hash).second_two_tags.all.should == [tv]
|
1356
|
+
end
|
1357
|
+
|
1358
|
+
specify "filter by associations with limited many_through_many associations should work correctly" do
|
1359
|
+
Artist.many_through_many :first_two_tags, {:clone=>:first_two_tags}.merge(@els)
|
1360
|
+
Artist.many_through_many :second_two_tags, {:clone=>:second_two_tags}.merge(@els)
|
1361
|
+
Artist.many_through_many :not_first_tags, {:clone=>:not_first_tags}.merge(@els)
|
1362
|
+
Artist.many_through_many :last_two_tags, {:clone=>:last_two_tags}.merge(@els)
|
1363
|
+
@album.update(:artist => @artist)
|
1364
|
+
tu, tv = @other_tags.call
|
1365
|
+
al, ar, _ = @pr.call
|
1366
|
+
al.update(:artist=>ar)
|
1367
|
+
al.add_tag(tu)
|
1368
|
+
ds = Artist.order(:name)
|
1369
|
+
|
1370
|
+
ds.where(:first_two_tags=>@tag).all.should == [@artist]
|
1371
|
+
ds.where(:first_two_tags=>tu).all.should == [@artist, ar]
|
1372
|
+
ds.where(:first_two_tags=>tv).all.should == []
|
1373
|
+
ds.exclude(:first_two_tags=>@tag).all.should == [ar]
|
1374
|
+
ds.exclude(:first_two_tags=>tu).all.should == []
|
1375
|
+
ds.exclude(:first_two_tags=>tv).all.should == [@artist, ar]
|
1376
|
+
|
1377
|
+
ds.where(:second_two_tags=>@tag).all.should == []
|
1378
|
+
ds.where(:second_two_tags=>tu).all.should == [@artist]
|
1379
|
+
ds.where(:second_two_tags=>tv).all.should == [@artist]
|
1380
|
+
ds.exclude(:second_two_tags=>@tag).all.should == [@artist, ar]
|
1381
|
+
ds.exclude(:second_two_tags=>tu).all.should == [ar]
|
1382
|
+
ds.exclude(:second_two_tags=>tv).all.should == [ar]
|
1383
|
+
|
1384
|
+
ds.where(:not_first_tags=>@tag).all.should == []
|
1385
|
+
ds.where(:not_first_tags=>tu).all.should == [@artist]
|
1386
|
+
ds.where(:not_first_tags=>tv).all.should == [@artist]
|
1387
|
+
ds.exclude(:not_first_tags=>@tag).all.should == [@artist, ar]
|
1388
|
+
ds.exclude(:not_first_tags=>tu).all.should == [ar]
|
1389
|
+
ds.exclude(:not_first_tags=>tv).all.should == [ar]
|
1390
|
+
|
1391
|
+
ds.where(:last_two_tags=>@tag).all.should == []
|
1392
|
+
ds.where(:last_two_tags=>tu).all.should == [@artist, ar]
|
1393
|
+
ds.where(:last_two_tags=>tv).all.should == [@artist]
|
1394
|
+
ds.exclude(:last_two_tags=>@tag).all.should == [@artist, ar]
|
1395
|
+
ds.exclude(:last_two_tags=>tu).all.should == []
|
1396
|
+
ds.exclude(:last_two_tags=>tv).all.should == [ar]
|
1397
|
+
|
1398
|
+
Artist.many_through_many :first_two_tags, :clone=>:first_tag do |ads| ads.where(:tags__name=>tu.name) end
|
1399
|
+
Artist.many_through_many :second_two_tags, :clone=>:first_tag do |ads| ads.where(:tags__name=>[tv.name, tu.name]) end
|
1400
|
+
|
1401
|
+
ds.where(:first_two_tags=>[@tag, tu]).all.should == [@artist, ar]
|
1402
|
+
ds.exclude(:first_two_tags=>[@tag, tu]).all.should == []
|
1403
|
+
|
1404
|
+
al.add_tag(tv)
|
1405
|
+
ds.where(:second_two_tags=>[tv, tu]).all.should == [@artist, ar]
|
1406
|
+
ds.exclude(:second_two_tags=>[tv, tu]).all.should == []
|
1407
|
+
end
|
1408
|
+
|
1409
|
+
specify "dataset associations with limited many_through_many associations should work correctly" do
|
1410
|
+
Artist.many_through_many :first_two_tags, {:clone=>:first_two_tags}.merge(@els)
|
1411
|
+
Artist.many_through_many :second_two_tags, {:clone=>:second_two_tags}.merge(@els)
|
1412
|
+
Artist.many_through_many :not_first_tags, {:clone=>:not_first_tags}.merge(@els)
|
1413
|
+
Artist.many_through_many :last_two_tags, {:clone=>:last_two_tags}.merge(@els)
|
1414
|
+
@album.update(:artist => @artist)
|
1415
|
+
tu, tv = @other_tags.call
|
1416
|
+
al, ar, _ = @pr.call
|
1417
|
+
al.update(:artist=>ar)
|
1418
|
+
al.add_tag(tu)
|
1419
|
+
ds = Artist.order(:name)
|
1420
|
+
|
1421
|
+
ds.where(@artist.pk_hash).first_two_tags.all.should == [@tag, tu]
|
1422
|
+
ds.where(@artist.pk_hash).second_two_tags.all.should == [tu, tv]
|
1423
|
+
ds.where(@artist.pk_hash).not_first_tags.all.should == [tu, tv]
|
1424
|
+
ds.where(@artist.pk_hash).last_two_tags.all.should == [tv, tu]
|
1425
|
+
ds.where(ar.pk_hash).first_two_tags.all.should == [tu]
|
1426
|
+
ds.where(ar.pk_hash).second_two_tags.all.should == []
|
1427
|
+
ds.where(ar.pk_hash).not_first_tags.all.should == []
|
1428
|
+
ds.where(ar.pk_hash).last_two_tags.all.should == [tu]
|
1429
|
+
|
1430
|
+
Artist.many_through_many :first_two_tags, :clone=>:first_two_tags do |ads| ads.where(:tags__name=>tu.name) end
|
1431
|
+
Artist.many_through_many :second_two_tags, :clone=>:second_two_tags do |ads| ads.where(:tags__name=>[tu.name, tv.name]) end
|
1432
|
+
|
1433
|
+
ds.where(@artist.pk_hash).first_two_tags.all.should == [tu]
|
1434
|
+
ds.where(@artist.pk_hash).second_two_tags.all.should == [tv]
|
1435
|
+
ds.where(ar.pk_hash).first_two_tags.all.should == [tu]
|
1436
|
+
ds.where(ar.pk_hash).second_two_tags.all.should == []
|
1437
|
+
|
1438
|
+
al.add_tag(tv)
|
1439
|
+
ds.where(@artist.pk_hash).first_two_tags.all.should == [tu]
|
1440
|
+
ds.where(@artist.pk_hash).second_two_tags.all.should == [tv]
|
1441
|
+
ds.where(ar.pk_hash).first_two_tags.all.should == [tu]
|
1442
|
+
ds.where(ar.pk_hash).second_two_tags.all.should == [tv]
|
1443
|
+
end
|
560
1444
|
end
|
561
1445
|
|
562
1446
|
shared_examples_for "basic regular and composite key associations" do
|
@@ -610,7 +1494,11 @@ shared_examples_for "basic regular and composite key associations" do
|
|
610
1494
|
Album.tags.all.should == []
|
611
1495
|
Album.alias_tags.all.should == []
|
612
1496
|
Artist.albums.all.should == []
|
613
|
-
|
1497
|
+
unless @no_many_through_many
|
1498
|
+
Album.first_tags.all.should == []
|
1499
|
+
Artist.tags.all.should == []
|
1500
|
+
Artist.first_tags.all.should == []
|
1501
|
+
end
|
614
1502
|
Artist.albums.tags.all.should == []
|
615
1503
|
|
616
1504
|
@album.update(:artist => @artist)
|
@@ -621,7 +1509,11 @@ shared_examples_for "basic regular and composite key associations" do
|
|
621
1509
|
Album.tags.all.should == [@tag]
|
622
1510
|
Album.alias_tags.all.should == [@tag]
|
623
1511
|
Artist.albums.all.should == [@album]
|
624
|
-
|
1512
|
+
unless @no_many_through_many
|
1513
|
+
Album.first_tags.all.should == [@tag]
|
1514
|
+
Artist.tags.all.should == [@tag]
|
1515
|
+
Artist.first_tags.all.should == [@tag]
|
1516
|
+
end
|
625
1517
|
Artist.albums.tags.all.should == [@tag]
|
626
1518
|
|
627
1519
|
album.add_tag(tag)
|
@@ -632,7 +1524,11 @@ shared_examples_for "basic regular and composite key associations" do
|
|
632
1524
|
Album.tags.order(:name).all.should == [@tag, tag]
|
633
1525
|
Album.alias_tags.order(:name).all.should == [@tag, tag]
|
634
1526
|
Artist.albums.order(:name).all.should == [@album, album]
|
635
|
-
|
1527
|
+
unless @no_many_through_many
|
1528
|
+
Album.first_tags.order(:name).all.should == [@tag, tag]
|
1529
|
+
Artist.tags.order(:name).all.should == [@tag, tag]
|
1530
|
+
Artist.first_tags.order(:name).all.should == [@tag, tag]
|
1531
|
+
end
|
636
1532
|
Artist.albums.tags.order(:name).all.should == [@tag, tag]
|
637
1533
|
|
638
1534
|
Tag.filter(Tag.qualified_primary_key_hash(tag.pk)).albums.all.should == [album]
|
@@ -640,7 +1536,11 @@ shared_examples_for "basic regular and composite key associations" do
|
|
640
1536
|
Album.filter(Album.qualified_primary_key_hash(album.pk)).tags.all.should == [tag]
|
641
1537
|
Album.filter(Album.qualified_primary_key_hash(album.pk)).alias_tags.all.should == [tag]
|
642
1538
|
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).albums.all.should == [album]
|
643
|
-
|
1539
|
+
unless @no_many_through_many
|
1540
|
+
Album.filter(Album.qualified_primary_key_hash(album.pk)).first_tags.all.should == [tag]
|
1541
|
+
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).tags.all.should == [tag]
|
1542
|
+
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).first_tags.all.should == [tag]
|
1543
|
+
end
|
644
1544
|
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).albums.tags.all.should == [tag]
|
645
1545
|
|
646
1546
|
Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).albums.filter(Album.qualified_primary_key_hash(album.pk)).tags.all.should == [tag]
|
@@ -772,6 +1672,9 @@ shared_examples_for "regular and composite key associations" do
|
|
772
1672
|
@els = {:eager_limit_strategy=>true}
|
773
1673
|
end
|
774
1674
|
it_should_behave_like "one_to_one eager limit strategies"
|
1675
|
+
it_should_behave_like "one_through_one eager limit strategies"
|
1676
|
+
it_should_behave_like "one_through_many eager limit strategies"
|
1677
|
+
it_should_behave_like "filter by associations singular association limit strategies"
|
775
1678
|
end if DB.dataset.supports_ordered_distinct_on?
|
776
1679
|
|
777
1680
|
describe "with :eager_limit_strategy=>:window_function" do
|
@@ -779,6 +1682,7 @@ shared_examples_for "regular and composite key associations" do
|
|
779
1682
|
@els = {:eager_limit_strategy=>:window_function}
|
780
1683
|
end
|
781
1684
|
it_should_behave_like "eager limit strategies"
|
1685
|
+
it_should_behave_like "filter by associations limit strategies"
|
782
1686
|
end if DB.dataset.supports_window_functions?
|
783
1687
|
|
784
1688
|
specify "should work with a many_through_many association" do
|
@@ -809,6 +1713,35 @@ shared_examples_for "regular and composite key associations" do
|
|
809
1713
|
a.first.artist.should == @artist
|
810
1714
|
a.first.artist.tags.should == [@tag]
|
811
1715
|
end
|
1716
|
+
|
1717
|
+
specify "should work with a one_through_many association" do
|
1718
|
+
@album.update(:artist => @artist)
|
1719
|
+
@album.add_tag(@tag)
|
1720
|
+
|
1721
|
+
@album.reload
|
1722
|
+
@artist.reload
|
1723
|
+
@tag.reload
|
1724
|
+
|
1725
|
+
@album.tags.should == [@tag]
|
1726
|
+
|
1727
|
+
a = Artist.eager(:first_tag).all
|
1728
|
+
a.should == [@artist]
|
1729
|
+
a.first.first_tag.should == @tag
|
1730
|
+
|
1731
|
+
a = Artist.eager_graph(:first_tag).all
|
1732
|
+
a.should == [@artist]
|
1733
|
+
a.first.first_tag.should == @tag
|
1734
|
+
|
1735
|
+
a = Album.eager(:artist=>:first_tag).all
|
1736
|
+
a.should == [@album]
|
1737
|
+
a.first.artist.should == @artist
|
1738
|
+
a.first.artist.first_tag.should == @tag
|
1739
|
+
|
1740
|
+
a = Album.eager_graph(:artist=>:first_tag).all
|
1741
|
+
a.should == [@album]
|
1742
|
+
a.first.artist.should == @artist
|
1743
|
+
a.first.artist.first_tag.should == @tag
|
1744
|
+
end
|
812
1745
|
end
|
813
1746
|
|
814
1747
|
describe "Sequel::Model Simple Associations" do
|
@@ -849,11 +1782,15 @@ describe "Sequel::Model Simple Associations" do
|
|
849
1782
|
one_to_one :first_a_album, :clone=>:a_albums
|
850
1783
|
plugin :many_through_many
|
851
1784
|
many_through_many :tags, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]]
|
852
|
-
many_through_many :first_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>2
|
853
|
-
many_through_many :second_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>[2, 1]
|
854
|
-
many_through_many :not_first_tags, :clone=>:tags, :order=>:tags__name, :limit=>[nil, 1]
|
855
|
-
many_through_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:tags__name), :limit=>2
|
1785
|
+
many_through_many :first_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>2, :graph_order=>:name
|
1786
|
+
many_through_many :second_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>[2, 1], :graph_order=>:name
|
1787
|
+
many_through_many :not_first_tags, :clone=>:tags, :order=>:tags__name, :limit=>[nil, 1], :graph_order=>:name
|
1788
|
+
many_through_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:tags__name), :limit=>2, :graph_order=>Sequel.desc(:name)
|
856
1789
|
many_through_many :t_tags, :clone=>:tags, :conditions=>{:tags__name=>'T'}
|
1790
|
+
one_through_many :first_tag, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]], :order=>:tags__name, :graph_order=>:name, :class=>:Tag
|
1791
|
+
one_through_many :second_tag, :clone=>:first_tag, :limit=>[nil, 1]
|
1792
|
+
one_through_many :last_tag, :clone=>:first_tag, :order=>Sequel.desc(:tags__name), :graph_order=>Sequel.desc(:name)
|
1793
|
+
one_through_many :t_tag, :clone=>:first_tag, :conditions=>{:tags__name=>'T'}
|
857
1794
|
end
|
858
1795
|
class ::Album < Sequel::Model(@db)
|
859
1796
|
plugin :dataset_associations
|
@@ -867,6 +1804,11 @@ describe "Sequel::Model Simple Associations" do
|
|
867
1804
|
many_to_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:name), :limit=>2
|
868
1805
|
many_to_many :t_tags, :clone=>:tags, :conditions=>{:name=>'T'}
|
869
1806
|
many_to_many :alias_t_tags, :clone=>:t_tags, :join_table=>:albums_tags___at
|
1807
|
+
one_through_one :first_tag, :clone=>:tags, :order=>:name
|
1808
|
+
one_through_one :second_tag, :clone=>:first_tag, :limit=>[nil, 1]
|
1809
|
+
one_through_one :last_tag, :clone=>:tags, :order=>Sequel.desc(:name)
|
1810
|
+
one_through_one :t_tag, :clone=>:t_tags
|
1811
|
+
one_through_one :alias_t_tag, :clone=>:alias_t_tags
|
870
1812
|
end
|
871
1813
|
class ::Tag < Sequel::Model(@db)
|
872
1814
|
plugin :dataset_associations
|
@@ -1050,7 +1992,7 @@ describe "Sequel::Model Composite Key Associations" do
|
|
1050
1992
|
set_primary_key [:id1, :id2]
|
1051
1993
|
unrestrict_primary_key
|
1052
1994
|
one_to_many :albums, :key=>[:artist_id1, :artist_id2], :order=>:name
|
1053
|
-
one_to_one :first_album, :clone=>:albums
|
1995
|
+
one_to_one :first_album, :clone=>:albums
|
1054
1996
|
one_to_one :last_album, :clone=>:albums, :order=>Sequel.desc(:name)
|
1055
1997
|
one_to_one :second_album, :clone=>:albums, :limit=>[nil, 1]
|
1056
1998
|
one_to_many :first_two_albums, :clone=>:albums, :order=>:name, :limit=>2
|
@@ -1061,11 +2003,15 @@ describe "Sequel::Model Composite Key Associations" do
|
|
1061
2003
|
one_to_one :first_a_album, :clone=>:a_albums
|
1062
2004
|
plugin :many_through_many
|
1063
2005
|
many_through_many :tags, [[:albums, [:artist_id1, :artist_id2], [:id1, :id2]], [:albums_tags, [:album_id1, :album_id2], [:tag_id1, :tag_id2]]]
|
1064
|
-
many_through_many :first_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>2
|
1065
|
-
many_through_many :second_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>[2, 1]
|
1066
|
-
many_through_many :not_first_tags, :clone=>:tags, :order=>:tags__name, :limit=>[nil, 1]
|
1067
|
-
many_through_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:tags__name), :limit=>2
|
2006
|
+
many_through_many :first_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>2, :graph_order=>:name
|
2007
|
+
many_through_many :second_two_tags, :clone=>:tags, :order=>:tags__name, :limit=>[2, 1], :graph_order=>:name
|
2008
|
+
many_through_many :not_first_tags, :clone=>:tags, :order=>:tags__name, :limit=>[nil, 1], :graph_order=>:name
|
2009
|
+
many_through_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:tags__name), :limit=>2, :graph_order=>Sequel.desc(:name)
|
1068
2010
|
many_through_many :t_tags, :clone=>:tags do |ds| ds.where(:tags__name=>'T') end
|
2011
|
+
one_through_many :first_tag, [[:albums, [:artist_id1, :artist_id2], [:id1, :id2]], [:albums_tags, [:album_id1, :album_id2], [:tag_id1, :tag_id2]]], :order=>:tags__name, :graph_order=>:name, :class=>:Tag
|
2012
|
+
one_through_many :second_tag, :clone=>:first_tag, :limit=>[nil, 1]
|
2013
|
+
one_through_many :last_tag, :clone=>:first_tag, :order=>Sequel.desc(:tags__name), :graph_order=>Sequel.desc(:name)
|
2014
|
+
one_through_many :t_tag, :clone=>:first_tag do |ds| ds.where(:tags__name=>'T') end
|
1069
2015
|
end
|
1070
2016
|
class ::Album < Sequel::Model(@db)
|
1071
2017
|
plugin :dataset_associations
|
@@ -1081,6 +2027,11 @@ describe "Sequel::Model Composite Key Associations" do
|
|
1081
2027
|
many_to_many :last_two_tags, :clone=>:tags, :order=>Sequel.desc(:name), :limit=>2
|
1082
2028
|
many_to_many :t_tags, :clone=>:tags do |ds| ds.where(:name=>'T') end
|
1083
2029
|
many_to_many :alias_t_tags, :clone=>:t_tags, :join_table=>:albums_tags___at
|
2030
|
+
one_through_one :first_tag, :clone=>:tags, :order=>:name
|
2031
|
+
one_through_one :second_tag, :clone=>:first_tag, :limit=>[nil, 1]
|
2032
|
+
one_through_one :last_tag, :clone=>:tags, :order=>Sequel.desc(:name)
|
2033
|
+
one_through_one :t_tag, :clone=>:t_tags
|
2034
|
+
one_through_one :alias_t_tag, :clone=>:alias_t_tags
|
1084
2035
|
end
|
1085
2036
|
class ::Tag < Sequel::Model(@db)
|
1086
2037
|
plugin :dataset_associations
|
@@ -1225,7 +2176,7 @@ describe "Sequel::Model pg_array_to_many" do
|
|
1225
2176
|
a.remove_tag(@tag)
|
1226
2177
|
a.save
|
1227
2178
|
end
|
1228
|
-
end if DB.database_type == :postgres && DB.adapter_scheme
|
2179
|
+
end if DB.database_type == :postgres && [:postgres, :jdbc].include?(DB.adapter_scheme) && DB.server_version >= 90300
|
1229
2180
|
|
1230
2181
|
describe "Sequel::Model many_to_pg_array" do
|
1231
2182
|
before(:all) do
|
@@ -1304,7 +2255,7 @@ describe "Sequel::Model many_to_pg_array" do
|
|
1304
2255
|
a.add_tag(@tag)
|
1305
2256
|
a.remove_tag(@tag)
|
1306
2257
|
end
|
1307
|
-
end if DB.database_type == :postgres && DB.adapter_scheme
|
2258
|
+
end if DB.database_type == :postgres && [:postgres, :jdbc].include?(DB.adapter_scheme) && DB.server_version >= 90300
|
1308
2259
|
|
1309
2260
|
describe "Sequel::Model Associations with clashing column names" do
|
1310
2261
|
before(:all) do
|
@@ -1334,6 +2285,7 @@ describe "Sequel::Model Associations with clashing column names" do
|
|
1334
2285
|
@Foo.one_to_one :bar, :primary_key=>:obj_id, :primary_key_column=>:object_id, :key=>:object_id, :key_method=>:obj_id, :class=>@Bar
|
1335
2286
|
@Bar.many_to_one :foo, :key=>:obj_id, :key_column=>:object_id, :primary_key=>:object_id, :primary_key_method=>:obj_id, :class=>@Foo
|
1336
2287
|
@Foo.many_to_many :mtmbars, :join_table=>:bars_foos, :left_primary_key=>:obj_id, :left_primary_key_column=>:object_id, :right_primary_key=>:object_id, :right_primary_key_method=>:obj_id, :left_key=>:foo_id, :right_key=>:object_id, :class=>@Bar
|
2288
|
+
@Foo.one_through_one :mtmbar, :join_table=>:bars_foos, :left_primary_key=>:obj_id, :left_primary_key_column=>:object_id, :right_primary_key=>:object_id, :right_primary_key_method=>:obj_id, :left_key=>:foo_id, :right_key=>:object_id, :class=>@Bar
|
1337
2289
|
@Bar.many_to_many :mtmfoos, :join_table=>:bars_foos, :left_primary_key=>:obj_id, :left_primary_key_column=>:object_id, :right_primary_key=>:object_id, :right_primary_key_method=>:obj_id, :left_key=>:object_id, :right_key=>:foo_id, :class=>@Foo
|
1338
2290
|
@foo = @Foo.create(:obj_id=>2)
|
1339
2291
|
@bar = @Bar.create(:obj_id=>2)
|
@@ -1348,6 +2300,7 @@ describe "Sequel::Model Associations with clashing column names" do
|
|
1348
2300
|
@Foo.first.bars.should == [@bar]
|
1349
2301
|
@Foo.first.bar.should == @bar
|
1350
2302
|
@Foo.first.mtmbars.should == [@bar]
|
2303
|
+
@Foo.first.mtmbar.should == @bar
|
1351
2304
|
@Bar.first.mtmfoos.should == [@foo]
|
1352
2305
|
end
|
1353
2306
|
|
@@ -1356,6 +2309,7 @@ describe "Sequel::Model Associations with clashing column names" do
|
|
1356
2309
|
@Foo.eager(:bars).all.map{|o| [o, o.bars]}.should == [[@foo, [@bar]]]
|
1357
2310
|
@Foo.eager(:bar).all.map{|o| [o, o.bar]}.should == [[@foo, @bar]]
|
1358
2311
|
@Foo.eager(:mtmbars).all.map{|o| [o, o.mtmbars]}.should == [[@foo, [@bar]]]
|
2312
|
+
@Foo.eager(:mtmbar).all.map{|o| [o, o.mtmbar]}.should == [[@foo, @bar]]
|
1359
2313
|
@Bar.eager(:mtmfoos).all.map{|o| [o, o.mtmfoos]}.should == [[@bar, [@foo]]]
|
1360
2314
|
end
|
1361
2315
|
|
@@ -1364,6 +2318,7 @@ describe "Sequel::Model Associations with clashing column names" do
|
|
1364
2318
|
@Foo.eager_graph(:bars).all.map{|o| [o, o.bars]}.should == [[@foo, [@bar]]]
|
1365
2319
|
@Foo.eager_graph(:bar).all.map{|o| [o, o.bar]}.should == [[@foo, @bar]]
|
1366
2320
|
@Foo.eager_graph(:mtmbars).all.map{|o| [o, o.mtmbars]}.should == [[@foo, [@bar]]]
|
2321
|
+
@Foo.eager_graph(:mtmbar).all.map{|o| [o, o.mtmbar]}.should == [[@foo, @bar]]
|
1367
2322
|
@Bar.eager_graph(:mtmfoos).all.map{|o| [o, o.mtmfoos]}.should == [[@bar, [@foo]]]
|
1368
2323
|
end
|
1369
2324
|
|