has-relationship 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc
CHANGED
@@ -0,0 +1,131 @@
|
|
1
|
+
= HasRelationship
|
2
|
+
|
3
|
+
This gem was based on insight provided by the article http://blog.hasmanythrough.com/2006/4/3/polymorphic-through.
|
4
|
+
It was developed because of a lack of solutions to be able to handle double polymorphism in rails. In other words,
|
5
|
+
there was no way to create an xref table (the middle table in a many-to-many relationship) that joined two unknown
|
6
|
+
tables together. There are obvious reasons for these limitations in rails, but nevertheless, a solution was needed.
|
7
|
+
|
8
|
+
HasRelationship hopefully is that solution. The user runs a migration that generates the "relationships" table. That
|
9
|
+
table is then used to join any two tables together and create a relationship between them. So now, when you want to
|
10
|
+
add a relationship between class 1 and class 2, you won't have to generate your own custom intermediate xref table
|
11
|
+
each time; the "relationships" table can be reused for each of your custom relationships.
|
12
|
+
|
13
|
+
== Installation
|
14
|
+
|
15
|
+
=== Rails 3.0
|
16
|
+
|
17
|
+
Add the following to your Gemfile:
|
18
|
+
|
19
|
+
gem 'has-relationship'
|
20
|
+
|
21
|
+
==== Post Installation
|
22
|
+
|
23
|
+
1. rails generate has_relationship:migration
|
24
|
+
2. rake db:migrate
|
25
|
+
|
26
|
+
== Usage
|
27
|
+
|
28
|
+
class User < ActiveRecord::Base
|
29
|
+
# Create a has-one-through relationship with the "tasks" table (Task class) through the "relationships" table
|
30
|
+
has_relationship :task
|
31
|
+
|
32
|
+
# Alternate approach to create a has-one-through relationship with the "tasks" table (Task class) through the "relationships" table
|
33
|
+
has_relationship "task"
|
34
|
+
|
35
|
+
# Alternate approach to create a has-one-through relationship with the "tasks" table (Task class) through the "relationships" table
|
36
|
+
has_relationship Task
|
37
|
+
|
38
|
+
# Alternate approach to create a has-one-through relationship with the "tasks" table (Task class) through the "relationships" table
|
39
|
+
has_relationship :tasks, :singular => true
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
# Create a has-many-through relationship with the "tasks" table (Task class) through the "relationships" table
|
44
|
+
has_relationship :tasks
|
45
|
+
|
46
|
+
# Create a has-many-through relationship called "other_tasks" with the "tasks" table (Task class) through the "relationships" table.
|
47
|
+
# Please note the addition of the :relationship attribute. This is optional but highly recommended, particularly when you're going
|
48
|
+
# to be declaring a "has_inverse_relationship" on the Task class, as shown below. This parameter sets the "relationship" field in
|
49
|
+
# the relationship table.
|
50
|
+
# If :relationship had not been set here, it still would have defaulted to "User_OtherTask"; the benefit however of manually declaring this
|
51
|
+
# is that it clear exactly what to name the relationship in your use of "has_inverse_relationship".
|
52
|
+
has_relationship :other_tasks, :class_name => "Task", :relationship => "User_OtherTask"
|
53
|
+
|
54
|
+
# Alternate approach to create a has-many-through relationship called "other_tasks" with the "tasks" table (Task class) through the "relationships" table
|
55
|
+
has_relationship :tasks, :as => :other_tasks, :relationship => "User_OtherTask"
|
56
|
+
end
|
57
|
+
|
58
|
+
class Task < ActiveRecord::Base
|
59
|
+
# Create a has-one-through relationship with the "users" table (User class) through the "relationships" table
|
60
|
+
has_inverse_relationship :user
|
61
|
+
|
62
|
+
# Alternate approach to create a has-one-through relationship with the "users" table (User class) through the "relationships" table
|
63
|
+
has_inverse_relationship "user"
|
64
|
+
|
65
|
+
# Alternate approach to create a has-one-through relationship with the "users" table (User class) through the "relationships" table
|
66
|
+
has_inverse_relationship User
|
67
|
+
|
68
|
+
# Alternate approach to create a has-one-through relationship with the "user" table (User class) through the "relationships" table
|
69
|
+
has_inverse_relationship :users, :singular => true
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
# Create a has-many-through relationship with the "users" table (User class) through the "relationships" table
|
74
|
+
has_inverse_relationship :users
|
75
|
+
|
76
|
+
# Create a has-many-through relationship called "other_users" with the "users" table (User class) through the "relationships" table
|
77
|
+
# Please note that here we specify the exact same :relationship as was used in the User class in its call to "has_relationship".
|
78
|
+
has_inverse_relationship :other_users, :class_name => "User", :relationship => "User_OtherTask"
|
79
|
+
|
80
|
+
# Alternate approach to create a has-many-through relationship called "other_users" with the "users" table (User class) through the "relationships" table
|
81
|
+
has_inverse_relationship :users, :as => :other_users, :relationship => "User_OtherTask"
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
# Create a has-one-through relationship with the "assignments" table (Assignment class) through the "relationships" table
|
86
|
+
has_inverse_relationship :assignment
|
87
|
+
|
88
|
+
# Create a has-many-through relationship with the "stories" table (Story Class) through the "relationships" table
|
89
|
+
has_relationship :stories
|
90
|
+
end
|
91
|
+
|
92
|
+
class Assignment < ActiveRecord::Base
|
93
|
+
# Create a has-many-through relationship with the "tasks" table (Task class) through the "relationships" table,
|
94
|
+
# and create another has-many-through relationship with the "stories" table (Story class) through the "relationships" table
|
95
|
+
has_relationship [:tasks, :stories]
|
96
|
+
|
97
|
+
# Create a has-many-through relationship called "other_tasks" with the "tasks" table (Task class) through the "relationships" table
|
98
|
+
has_relationship :tasks, :as => :other_tasks
|
99
|
+
end
|
100
|
+
|
101
|
+
class Story < ActiveRecord::Base
|
102
|
+
# Create a has-one-through relationship called "parent" with the "tasks" table (Task class) through the "relationships" table.
|
103
|
+
has_inverse_relationship :tasks, :as => :parent, :relationship => "Task_Story"
|
104
|
+
|
105
|
+
# Create a has-one-through relationship with the "tasks" table (Task class) through the "relationships" table.
|
106
|
+
has_inverse_relationship :task
|
107
|
+
end
|
108
|
+
|
109
|
+
@user = User.new(:name => "Bobby")
|
110
|
+
@user.task = Task.new
|
111
|
+
@user.tasks.build
|
112
|
+
@user.other_tasks << Task.new
|
113
|
+
@user.save
|
114
|
+
|
115
|
+
@assignment = Assignment.new
|
116
|
+
@assignment.tasks << Task.create
|
117
|
+
@assignment.stories.build
|
118
|
+
@assignment.other_tasks << Task.new
|
119
|
+
@assignment.save
|
120
|
+
|
121
|
+
@story = Story.new
|
122
|
+
@story.parent = Task.create
|
123
|
+
@story.task = Task.new
|
124
|
+
@story.save
|
125
|
+
|
126
|
+
Copyright (c) 2011 Andrew Hunter (http://github.com/hunterae) and Captico LLC. (http://captico.com/), released under the MIT license
|
127
|
+
|
128
|
+
== Special Thanks
|
129
|
+
|
130
|
+
HasRelationship was aided by some of the insight provided in the article http://blog.hasmanythrough.com/2006/4/3/polymorphic-through written by Josh Susser. Also many thanks to the ActsAsTaggableOn team[https://github.com/mbleigh/acts-as-taggable-on], as I have used your gem as a jumping point for writing my own, given the similar nature of the task at hand.
|
131
|
+
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
@@ -4,7 +4,7 @@ module HasRelationship
|
|
4
4
|
class MigrationGenerator < Rails::Generators::Base
|
5
5
|
include Rails::Generators::Migration
|
6
6
|
|
7
|
-
desc "Generates migration for
|
7
|
+
desc "Generates migration for Relationship models"
|
8
8
|
|
9
9
|
def self.orm
|
10
10
|
Rails::Generators.options[:rails][:orm]
|
@@ -45,7 +45,7 @@ module HasRelationship
|
|
45
45
|
has_one resource_name, :through => relationship_through, :class_name => class_name, :source => "relation2_#{class_name.downcase}".to_s, :conditions => ["relationships.relation2_type = ? and relationships.relationship in (?)", class_name, relationships], :select => options[:select]
|
46
46
|
else
|
47
47
|
has_many relationship_through, :as => :relation1, :dependent => :destroy, :class_name => "HasRelationship::Relationship", :conditions => {:relationship => relationship}
|
48
|
-
has_many resource_name, :through => relationship_through, :class_name => class_name, :source => "relation2_#{class_name.downcase}".to_sym, :conditions => ["relationships.relation2_type = ? and relationships.relationship in (?)", class_name, relationships], :select => options[:select]
|
48
|
+
has_many resource_name, :through => relationship_through, :readonly => false, :class_name => class_name, :source => "relation2_#{class_name.downcase}".to_sym, :conditions => ["relationships.relation2_type = ? and relationships.relationship in (?)", class_name, relationships], :select => options[:select]
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -95,7 +95,7 @@ module HasRelationship
|
|
95
95
|
has_one resource_name, :through => relationship_through, :class_name => class_name, :source => "relation1_#{class_name.downcase}".to_sym, :conditions => ["relationships.relation1_type = ? and relationships.relationship in (?)", class_name, relationships], :select => options[:select]
|
96
96
|
else
|
97
97
|
has_many relationship_through, :as => :relation2, :dependent => :destroy, :class_name => "HasRelationship::Relationship", :conditions => {:relationship => relationship}
|
98
|
-
has_many resource_name, :through => relationship_through, :class_name => class_name, :source => "relation1_#{class_name.downcase}".to_sym, :conditions => ["relationships.relation1_type = ? and relationships.relationship in (?)", class_name, relationships], :select => options[:select]
|
98
|
+
has_many resource_name, :through => relationship_through, :readonly => false, :class_name => class_name, :source => "relation1_#{class_name.downcase}".to_sym, :conditions => ["relationships.relation1_type = ? and relationships.relationship in (?)", class_name, relationships], :select => options[:select]
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has-relationship
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Hunter
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-27 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|