passive_record 0.4.10 → 0.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/passive_record/associations.rb +4 -3
- data/lib/passive_record/associations/has_many.rb +4 -0
- data/lib/passive_record/associations/has_many_through.rb +13 -5
- data/lib/passive_record/version.rb +1 -1
- data/spec/passive_record_spec.rb +10 -0
- data/spec/spec_helper.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1df1e784cf91a0992f637e1d716f80e480735de6
|
4
|
+
data.tar.gz: c42d72d513f9b2970ac550fac9ba4bf6cf17cf5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ac681f63db9780ce9604356125fe2d3e76efc029958e258c098da5a35599db0b871aa6fabe393dce3c6310d01bcd6f85758f7a63633ea695ad612f9d7905fd7
|
7
|
+
data.tar.gz: b91ffa6952369232fd89ae1c88b18cedcd6274a554c52845ebc523fda6bb32aaa641dcec8eb3f6191eec141a8b16be165812f4828d9175d636b47083147fc070
|
@@ -83,6 +83,7 @@ module PassiveRecord
|
|
83
83
|
|
84
84
|
def has_many(collection_name_sym, opts={})
|
85
85
|
target_class_name = opts.delete(:class_name) { (collection_name_sym.to_s).split('_').map(&:capitalize).join }
|
86
|
+
habtm = opts.delete(:habtm) { false }
|
86
87
|
|
87
88
|
association = nil
|
88
89
|
if opts.key?(:through)
|
@@ -92,7 +93,7 @@ module PassiveRecord
|
|
92
93
|
base_association = associations.detect { |assn| assn.child_class_name == through_class_name rescue false }
|
93
94
|
|
94
95
|
association = HasManyThroughAssociation.new(
|
95
|
-
self, target_class_name, collection_name_sym, through_class_collection_name, base_association)
|
96
|
+
self, target_class_name, collection_name_sym, through_class_collection_name, base_association, habtm)
|
96
97
|
|
97
98
|
associate!(association)
|
98
99
|
|
@@ -180,7 +181,7 @@ module PassiveRecord
|
|
180
181
|
|
181
182
|
if (intended_module.const_get(inverse_habtm_join_class_name) rescue false)
|
182
183
|
has_many inverse_habtm_join_class_name.underscore.pluralize.to_sym
|
183
|
-
has_many collection_name_sym, :through => inverse_habtm_join_class_name.underscore.pluralize.to_sym
|
184
|
+
has_many collection_name_sym, :through => inverse_habtm_join_class_name.underscore.pluralize.to_sym, habtm: true
|
184
185
|
else
|
185
186
|
auto_collection_sym = self.name.split('::').last.underscore.pluralize.to_sym
|
186
187
|
eval <<-ruby
|
@@ -191,7 +192,7 @@ module PassiveRecord
|
|
191
192
|
end # end
|
192
193
|
ruby
|
193
194
|
has_many habtm_join_class_name.underscore.pluralize.to_sym
|
194
|
-
has_many(collection_name_sym, :through => habtm_join_class_name.underscore.pluralize.to_sym)
|
195
|
+
has_many(collection_name_sym, :through => habtm_join_class_name.underscore.pluralize.to_sym, habtm: true)
|
195
196
|
end
|
196
197
|
end
|
197
198
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module PassiveRecord
|
2
2
|
module Associations
|
3
|
-
class HasManyThroughAssociation < Struct.new(:parent_class, :child_class_name, :target_name_symbol, :through_class, :base_association)
|
3
|
+
class HasManyThroughAssociation < Struct.new(:parent_class, :child_class_name, :target_name_symbol, :through_class, :base_association, :habtm)
|
4
4
|
def to_relation(parent_model)
|
5
5
|
HasManyThroughRelation.new(self, parent_model)
|
6
6
|
end
|
@@ -91,12 +91,20 @@ module PassiveRecord
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def intermediary_conditions
|
94
|
-
if intermediary_relation.
|
95
|
-
# we are 'thru' a has_many thru at the same level, we should be able to recurse thru its #intermediary_conds
|
94
|
+
if intermediary_relation.is_a?(HasManyThroughRelation)
|
96
95
|
conds = intermediary_relation.intermediary_conditions
|
97
|
-
|
96
|
+
|
97
|
+
if nested_association.habtm
|
98
|
+
{ association.through_class => conds }
|
99
|
+
else
|
100
|
+
{ association.through_class.to_s.singularize.to_sym => conds }
|
101
|
+
end
|
98
102
|
elsif intermediary_relation.association.is_a?(HasManyAssociation) # normal has many?
|
99
|
-
intermediary_key =
|
103
|
+
intermediary_key = if association.habtm
|
104
|
+
association.base_association.children_name_sym
|
105
|
+
else
|
106
|
+
intermediary_relation.association.children_name_sym.to_s.singularize.to_sym
|
107
|
+
end
|
100
108
|
nested_conds = { intermediary_key => { parent_model_id_field.to_sym => parent_model.id } }
|
101
109
|
|
102
110
|
if nested_association.is_a?(HasManyThroughAssociation)
|
data/spec/passive_record_spec.rb
CHANGED
@@ -342,6 +342,16 @@ describe "passive record models" do
|
|
342
342
|
expect(network.comments.approved).not_to include(unapproved_comment)
|
343
343
|
end
|
344
344
|
end
|
345
|
+
|
346
|
+
describe 'should find related models a recursive has_many :thru a habtm' do
|
347
|
+
let!(:promoted_tag) { Post.first.create_tag(promoted: true) }
|
348
|
+
let!(:unpromoted_tag) { Post.last.create_tag(promoted: false) }
|
349
|
+
|
350
|
+
it 'should refine and restrict' do
|
351
|
+
expect(network.tags.promoted).to include(promoted_tag)
|
352
|
+
expect(network.tags.promoted).not_to include(unpromoted_tag)
|
353
|
+
end
|
354
|
+
end
|
345
355
|
end
|
346
356
|
end
|
347
357
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -106,6 +106,7 @@ class Network < Model
|
|
106
106
|
has_many :streams
|
107
107
|
has_many :posts, :through => :streams
|
108
108
|
has_many :comments, :through => :posts
|
109
|
+
has_many :tags, :through => :posts
|
109
110
|
end
|
110
111
|
|
111
112
|
class Stream < Model
|
@@ -131,11 +132,18 @@ class Blog < Model
|
|
131
132
|
belongs_to :feed
|
132
133
|
end
|
133
134
|
|
135
|
+
class Tag < Model
|
136
|
+
has_and_belongs_to_many :posts
|
137
|
+
attr_accessor :promoted
|
138
|
+
def self.promoted; where(promoted: true) end
|
139
|
+
end
|
140
|
+
|
134
141
|
class Post < Model
|
135
142
|
belongs_to :author
|
136
143
|
belongs_to :blog
|
137
144
|
has_many :comments
|
138
145
|
has_many :commenters, :through => :comments, :class_name => "Author"
|
146
|
+
has_and_belongs_to_many :tags
|
139
147
|
|
140
148
|
attr_accessor :active, :published_at
|
141
149
|
before_create { @published_at = Time.now }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: passive_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Weissman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|