Hello,
I am looking to create a rails app that will model and display
related nodes. I am just beginning to dive into active record and I
was wondering if the following pesudo code would work?
class NodeLink < ActiveRecord::Base
belongs_to :node # foreign key - node_id (recorded as
primary_node_id)
belongs_to :node # foreign key - node_id (recorded as
secondary_node_id)
end
class Node < ActiveRecord::Base
has_many :nodes, :through => :node_links
end
In essence this would create something that looks like the following.
[Node One]
| |
| |
[Node Two] [Node Three]
|
|
[Node Four]
Where the node links are represented by the lines and the nodes
themselves are enclosed in brackets. And this pattern could be
continued indefinite through different variations of nodes and links.
Any help or advice you could give would be great.
Thanks,
Devin Morin
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.
On Dec 22, 11:16 pm, Devin M <devin...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hello, > I am looking to create a rails app that will model and display > related nodes. I am just beginning to dive into active record and I > was wondering if the following pesudo code would work? > > class NodeLink < ActiveRecord::Base > belongs_to :node # foreign key - node_id (recorded as > primary_node_id) > belongs_to :node # foreign key - node_id (recorded as > secondary_node_id) > endYou''ll need to specify different names for these two associations; a working declaration might look like: class NodeLink < ActiveRecord::Base belongs_to :primary_node, :class_name => ''Node'' belongs_to :secondary_node, :class_name => ''Node'' end> class Node < ActiveRecord::Base > has_many :nodes, :through => :node_links > endThis gets messier: class Node < ActiveRecord::Base has_many :primary_links, :foreign_key => ''primary_node_id'', :class_name => ''NodeLink'' has_many :secondary_links, :foreign_key => ''secondary_node_id'', :class_name => ''NodeLink'' has_many :primary_nodes, :through => :primary_links, :source => :secondary_node has_many :secondary_nodes, :through => :secondary_links, :source => :primary_node end This offers some additional detail: http://stackoverflow.com/questions/578084/how-to-implement-undirected-graph-in-ruby-on-rails Note that it''s going to be fairly complicated to deal with "all nodes that are connected to this one" unless you denormalize somewhat and make *two* NodeLinks for each edge. You may want to consider if you *really* need a completely undirected graph, or if there''s additional structure (tree-like behavior, for instance) that you can simplify things with. If this is a central concern to your app, you may want to look into the specialized "graph databases" that are now available. --Matt Jones -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
> Note that it''s going to be fairly complicated to deal with "all nodes > that are connected to this one" unless you denormalize somewhat and > make *two* NodeLinks for each edge. You may want to consider if you > *really* need a completely undirected graph, or if there''s additional > structure (tree-like behavior, for instance) that you can simplify > things with. > > If this is a central concern to your app, you may want to look into > the specialized "graph databases" that are now available. > > --Matt JonesThis will be a central concern of my app, is there any resources I can use to study undirected graphs? And I feel that the denormalization would be an accepted way of dealing with the issue. From what I understand this would entail having a table with -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Whoops, message got cut off. From what I can guess this denormalization just basically means you store the relations between the nodes in a table to save on compute time when performing a lookup on the Db? Regards, Devin Morin -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Devin:
Unsolicited, but here''s a pair of classes I''ve used for
representing
"vertices" (nodes) and "edges" (node links). You could
conceptually
"Vertex".gsub("NodeLink") and
"Edge".gsub("Node") and get 80% of where
you want to get. The useful bits:
- the belongs_to clauses in Edge implement the kind of thing you''re
describing
- the before_destroy clause in Vertex takes the place of dependent =>
destroy
- the edges method in Vertex finds both "left" and "right"
links.
Also, this is a self-contained sample useful for testing, since it
includes the up() and down() methods to create and destroy the tables
while you''re trying things out. I use this pattern a lot.
The example does NOT check for circular dependencies and such (since
edges and vertices may describe circular graphs), but you might find it
helpful.
class Edge < ActiveRecord::Base
belongs_to :vertex_a, :class_name => ''Vertex'',
:foreign_key =>
''vertex_a_id''
belongs_to :vertex_b, :class_name => ''Vertex'',
:foreign_key =>
''vertex_b_id''
def self.up()
ActiveRecord::Schema.define do
create_table "edges", :force => true do |t|
t.integer "vertex_a_id"
t.integer "vertex_b_id"
end
end
end
def self.down()
ActiveRecord::Schema.define do
drop_table :edges
end
end
end
class Vertex < ActiveRecord::Base
before_destroy do |record|
Edge.destroy_all "vertex_a_id = #{record.id}"
Edge.destroy_all "vertex_b_id = #{record.id}"
end
# has_many :vertices will not work in this case, so here''s
# how we find all edges asociated with this vertex...
def edges
Edge.find_all_by_vertex_a_id(self.id) +
Edge.find_all_by_vertex_b_id(self.id)
end
has_many :vertices
def self.up()
ActiveRecord::Schema.define do
create_table "vertices", :force => true do |t|
t.float "x"
t.float "y"
t.float "z"
end
end
end
def self.down()
ActiveRecord::Schema.define do
drop_table :vertices
end
end
end
# Testing...
def setup
Edge.up
Vertex.up
v0 = Vertex.create(:x => 0.0, :y => 0.0, :z => 0.0)
v1 = Vertex.create(:x => 1.0, :y => 1.0, :z => 1.0)
e0 = Edge.create(:vertex_a => v0, :vertex_b => v1)
[v0, v1, e0]
end
def teardown
Edge.down
Vertex.down
end
--
Posted via http://www.ruby-forum.com/.
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.