symmetry 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
- metadata.gz: bc2f0af03b14a6d059fc2ef7ab5085503d93f73a
4
- data.tar.gz: b7f9423a384a2239bbb38522ed8e46f77b287787
3
+ metadata.gz: eeaa72663ec6aa7831238b732485f139048bd0df
4
+ data.tar.gz: b5a31fb66056e892132fdc796061b830c24e64f9
5
5
  !binary "U0hBNTEy":
6
- metadata.gz: 4c732c5f9d47f9eaffcdd13c55c31cc488cf93743cb240dd7968c7fd025cd06d6acf4ac2e5b7c73ea32be69b70ca9e2c26bb4f31a8d8c62fa7a522c892acea9e
7
- data.tar.gz: b325e1b03eab6d8316c4bc4fd1d5e6ca5ab3294128cf82be2504109dcb749db2d785495c85e1003c7a41b02e315ddaf4e351646e9cd33fd23adebf4a7000fabc
6
+ metadata.gz: 51cc648a21f96c9e162c920c399c5e118f12a4e082f5ba1e3d1e4d44653a3cb756e2e5445e29c09483d8d02b2a696c92d073e6b4f882b1911e21b618786cf287
7
+ data.tar.gz: b6b8a19ab82cf76eec806912cc25a1fe833f867c7d51954f3719d4f00216746aa8650d6fcd49c7b1cc4216624f132247d6817351e0d73979afd894775db2811b
data/README.rdoc CHANGED
@@ -6,4 +6,99 @@
6
6
  {<img src="https://coveralls.io/repos/djonasson/symmetry/badge.png?branch=master" alt="Coverage Status" />}[https://coveralls.io/r/djonasson/symmetry]
7
7
  {<img src="https://badge.fury.io/rb/symmetry.png" alt="Gem Version" />}[http://badge.fury.io/rb/symmetry]
8
8
 
9
- Symmetry gives you a simple way of creating symmetric has_and_belongs_to_many relationships (friendships, neighbors, etc.) in your Active Record models.
9
+ Symmetry gives you a simple way of creating symmetric has_and_belongs_to_many relationships (friends, neighbors, etc.) in your Active Record models.
10
+
11
+
12
+ == Installation
13
+
14
+ Add it to your Gemfile:
15
+
16
+ gem "symmetry"
17
+
18
+ Install the migrations:
19
+
20
+ rake symmetry_engine:install:migrations db:migrate
21
+
22
+
23
+ == Usage
24
+
25
+ Define a symmetric relationship:
26
+
27
+ class User < ActiveRecord::Base
28
+ symmetric_relationship :friends
29
+ end
30
+
31
+ class Country < ActiveRecord::Base
32
+ symmetric_relationship :neighbors, polymorphic_relationship_name: :neighborships
33
+ end
34
+
35
+ Use it:
36
+
37
+ # User
38
+
39
+ irb(main)> u = User.create(name: "Daniel")
40
+ => #<User id: 1, name: "Daniel", ...>
41
+
42
+ irb(main)> u.friends
43
+ => []
44
+
45
+ irb(main)> u.friend_relationships
46
+ => []
47
+
48
+
49
+ # Country
50
+
51
+ irb(main)> c = Country.create(name: "Sweden")
52
+ => #<Country id: 1, name: "Sweden", ...>
53
+
54
+ irb(main)> c.neighbors << Country.create(name: "Norway")
55
+ => [#<Country id: 2, name: "Norway", ...>]
56
+
57
+ irb(main)> c.neighbors
58
+ => [#<Country id: 2, name: "Norway", ...>]
59
+
60
+ irb(main)> Country.find(2).neighbors
61
+ => [#<Country id: 1, name: "Sweden", ...>]
62
+
63
+ irb(main)> c.neighborships
64
+ => [#<SymmetricRelationship id: 1, owner_id: 1, owner_type: "Country", relation_id: 2, relation_type: "Country", relationship_name: "neighbors" ...>, ...]
65
+
66
+ It is possible to define multiple symmetric relationships on the same model:
67
+
68
+ class Politician
69
+ symmetric_relationship :friends
70
+ symmetric_relationship :enemies
71
+ end
72
+
73
+ irb(main)> p1 = Politician.create(name: 'A')
74
+ => #<Politician id: 1, name: "A", ...>
75
+
76
+ irb(main)> p2 = Politician.create(name: 'B')
77
+ => #<Politician id: 2, name: "B", ...>
78
+
79
+ irb(main)> p3 = Politician.create(name: 'C')
80
+ => #<Politician id: 3, name: "C", ...>
81
+
82
+ irb(main)> p1.friends
83
+ => []
84
+
85
+ irb(main)> p1.enemies
86
+ => []
87
+
88
+ irb(main)> p1.friends << p2
89
+ => [#<Politician id: 2, name: "B", ...>]
90
+
91
+ irb(main)> p1.enemies << p3
92
+ => [#<Politician id: 3, name: "C", ...>]
93
+
94
+ irb(main)> p1.friends.count
95
+ => 1
96
+
97
+ irb(main)> p1.enemies.count
98
+ => 1
99
+
100
+ irb(main)> p2.friends.count
101
+ => 1
102
+
103
+ irb(main)> p2.enemies.count
104
+ => 0
@@ -1,28 +1,26 @@
1
1
  class SymmetricRelationship < ActiveRecord::Base
2
- attr_accessible :owner_id, :owner_type, :relation_id, :relation_type
2
+ attr_accessible :owner_id, :owner_type, :relation_id, :relation_type, :relationship_name
3
3
 
4
4
  belongs_to :owner, polymorphic: true
5
5
  belongs_to :relation, polymorphic: true
6
6
 
7
- validates :owner_id, presence: true, uniqueness: { scope: [:owner_type, :relation_id, :relation_type] }
7
+ validates :owner_id, presence: true, uniqueness: { scope: [:owner_type, :relation_id, :relation_type, :relationship_name] }
8
8
  validates :owner_type, presence: true
9
9
  validates :relation_id, presence: true
10
10
  validates :relation_type, presence: true
11
+ validates :relationship_name, presence: true
11
12
 
12
- after_create :create_symetric_relation
13
- after_destroy :destroy_symetric_relation
13
+ after_create :create_symetric_relationship
14
+ after_destroy :destroy_symetric_relationship
14
15
 
15
16
  private
16
17
 
17
- def create_symetric_relation
18
- if self.class.where(owner_id: relation_id, owner_type: relation_type, relation_id: owner_id, relation_type: owner_type).empty?
19
- self.class.create(owner_id: relation_id, owner_type: relation_type, relation_id: owner_id, relation_type: owner_type)
20
- end
18
+ def create_symetric_relationship
19
+ attrs = { owner_id: relation_id, owner_type: relation_type, relation_id: owner_id, relation_type: owner_type, relationship_name: relationship_name }
20
+ self.class.create(attrs) if self.class.where(attrs).empty?
21
21
  end
22
22
 
23
- def destroy_symetric_relation
24
- self.class.where(owner_id: relation_id, owner_type: relation_type, relation_id: owner_id, relation_type: owner_type).each do |record|
25
- record.delete
26
- end
23
+ def destroy_symetric_relationship
24
+ self.class.where(owner_id: relation_id, owner_type: relation_type, relation_id: owner_id, relation_type: owner_type, relationship_name: relationship_name).delete_all
27
25
  end
28
26
  end
@@ -0,0 +1,5 @@
1
+ class AddRelationshipNameToSymmetricRelationships < ActiveRecord::Migration
2
+ def change
3
+ add_column :symmetric_relationships, :relationship_name, :string
4
+ end
5
+ end
@@ -1,15 +1,15 @@
1
1
  module Symmetry
2
2
  module ActiveRecord
3
3
 
4
- def symmetric_relation(relation_name, options = {})
5
- options.assert_valid_keys(:polymorphic_relation_name)
4
+ def symmetric_relationship(relationship_name, options = {})
5
+ options.assert_valid_keys(:polymorphic_relationship_name)
6
6
 
7
- relation_name_singular = relation_name.to_s.singularize
8
- polymorphic_relation_name = options[:polymorphic_relation_name].presence || "#{relation_name_singular}_relations"
7
+ relationship_name_singular = relationship_name.to_s.singularize
8
+ polymorphic_relationship_name = options[:polymorphic_relationship_name].presence || "#{relationship_name_singular}_relationships"
9
9
 
10
- attr_accessible "#{relation_name_singular}_ids"
11
- has_many polymorphic_relation_name, class_name: "SymmetricRelationship", as: :owner, dependent: :destroy
12
- has_many relation_name, through: polymorphic_relation_name, as: :relation, source: :relation, source_type: self.name
10
+ attr_accessible "#{relationship_name_singular}_ids"
11
+ has_many polymorphic_relationship_name, class_name: "SymmetricRelationship", as: :owner, dependent: :destroy, conditions: { relationship_name: relationship_name }
12
+ has_many relationship_name, through: polymorphic_relationship_name, as: :relation, source: :relation, source_type: self.name
13
13
  end
14
14
 
15
15
  end
@@ -1,3 +1,3 @@
1
1
  module Symmetry
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: symmetry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Jonasson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-17 00:00:00.000000000 Z
11
+ date: 2013-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,18 +16,18 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.1.0
19
+ version: 3.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.1.0
26
+ version: 3.0.0
27
27
  description: |-
28
28
  Symmetry gives you a simple way of creating symmetric
29
- has_and_belongs_to_many relationships (friendships, neighbors, etc.) in
30
- your Active Record models. More information can be found at:
29
+ has_and_belongs_to_many relationships (friends, neighbors, etc.) in your
30
+ Active Record models. More information can be found at:
31
31
  https://github.com/djonasson/worldwise
32
32
  email:
33
33
  - daniel@guadeo.com
@@ -37,6 +37,7 @@ extra_rdoc_files: []
37
37
  files:
38
38
  - app/models/symmetric_relationship.rb
39
39
  - config/routes.rb
40
+ - db/migrate/20130323091106_add_relationship_name_to_symmetric_relationships.rb
40
41
  - db/migrate/20130201161328_create_symmetric_relationships.rb
41
42
  - lib/tasks/testing_tasks.rake
42
43
  - lib/symmetry/active_record.rb