prim 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/prim.rb +10 -0
- data/lib/prim/collection.rb +18 -7
- data/lib/prim/instance_methods.rb +8 -0
- data/lib/prim/relationship.rb +1 -0
- data/prim.gemspec +1 -1
- metadata +1 -1
data/lib/prim.rb
CHANGED
@@ -26,6 +26,8 @@ module Prim
|
|
26
26
|
# Store this configuration for global access.
|
27
27
|
Prim.configured_primaries << self.prim_relationships[ singular_name ]
|
28
28
|
|
29
|
+
# Create dynamic methods for getting and setting the
|
30
|
+
# primary Collection member.
|
29
31
|
define_method "primary_#{ singular_name }" do
|
30
32
|
prim_collection_for(singular_name).primary
|
31
33
|
end
|
@@ -33,6 +35,14 @@ module Prim
|
|
33
35
|
define_method "primary_#{ singular_name }=" do |instance|
|
34
36
|
prim_collection_for(singular_name).primary = instance
|
35
37
|
end
|
38
|
+
|
39
|
+
# We alias the association's method chain so the original can be accessed.
|
40
|
+
# IS THIS IMPORTANT?!
|
41
|
+
define_method "#{ association_name }_with_primaries" do
|
42
|
+
prim_collection_for(singular_name).all
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_method_chain association_name, :primaries
|
36
46
|
end
|
37
47
|
end
|
38
48
|
|
data/lib/prim/collection.rb
CHANGED
@@ -15,9 +15,6 @@ module Prim
|
|
15
15
|
def initialize relationship, instance
|
16
16
|
@instance = instance
|
17
17
|
@relationship = relationship
|
18
|
-
|
19
|
-
# Attach the relationship to the mapping class.
|
20
|
-
relationship.reflected_class.prim_relationship = relationship
|
21
18
|
end
|
22
19
|
|
23
20
|
# Loads the primary member of this collection.
|
@@ -48,6 +45,20 @@ module Prim
|
|
48
45
|
true
|
49
46
|
end
|
50
47
|
|
48
|
+
def all options = {}
|
49
|
+
options[:with_primaries] ||= true
|
50
|
+
|
51
|
+
if options[:with_primaries]
|
52
|
+
primary_member = primary
|
53
|
+
sources.tap do |records|
|
54
|
+
records.find { |r| r == primary_member }.try(:primary=, true)
|
55
|
+
records
|
56
|
+
end
|
57
|
+
else
|
58
|
+
sources
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
51
62
|
private
|
52
63
|
|
53
64
|
# Creates a new source record and a mapping between it and the owner instance.
|
@@ -63,12 +74,12 @@ module Prim
|
|
63
74
|
mappings.create( relationship.foreign_key => source_record.id, primary: true )
|
64
75
|
end
|
65
76
|
|
66
|
-
def mappings
|
67
|
-
instance.
|
77
|
+
def mappings
|
78
|
+
instance.association( relationship.collection_label ).proxy
|
68
79
|
end
|
69
80
|
|
70
|
-
def sources
|
71
|
-
instance.
|
81
|
+
def sources
|
82
|
+
instance.association( relationship.association_name ).proxy
|
72
83
|
end
|
73
84
|
|
74
85
|
# Returns the mapping for a given source record. If this Relationship doesn't
|
@@ -5,10 +5,16 @@ module Prim
|
|
5
5
|
module InstanceMethods
|
6
6
|
|
7
7
|
module Owner
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
8
10
|
def prim_collection_for singular_name
|
9
11
|
@_prim_collections ||= {}
|
10
12
|
@_prim_collections[ singular_name ] ||= Prim::Collection.new(self.class.prim_relationships[ singular_name ], self)
|
11
13
|
end
|
14
|
+
|
15
|
+
included do
|
16
|
+
alias_method :assign_prim_collection_for, :prim_collection_for
|
17
|
+
end
|
12
18
|
end
|
13
19
|
|
14
20
|
module Reflected
|
@@ -25,6 +31,8 @@ module Prim
|
|
25
31
|
def only_one_primary
|
26
32
|
if self[:primary]
|
27
33
|
siblings.update_all('"primary" = false')
|
34
|
+
elsif siblings.where( primary: true ).first.nil?
|
35
|
+
self[:primary] = true
|
28
36
|
end
|
29
37
|
end
|
30
38
|
|
data/lib/prim/relationship.rb
CHANGED
data/prim.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "prim"
|
3
|
-
s.version = "0.0.
|
3
|
+
s.version = "0.0.6"
|
4
4
|
s.date = "2013-01-02"
|
5
5
|
s.summary = "Easily manage Rails associations that need a primary member."
|
6
6
|
s.description = "With Prim it's easy to add a primary member to any one-to-many or many-to-many association. " +
|