I''m working on an app with a friend type system. I currently have setup like this with 2 tables. users table keeps track of users user_relationships table keeps track of friendships. Now, there should be two rows for each relationship. This is to keep track of the directional nature of the relationship between users. Each time a relationship is made, both rows should be inserted into the table. user_1 user_2 data user_2 user_1 data So what I can''t decide is what is the best way to implement these in my rails app to be able to create a view of all user_relationships with a given userid. I can define a Relationship class, and mark User with has_many. But that will only select the relationships based on one column right? So it would look in one column and find all rows from that column. so if I call User.relationships I will only have half of the relationship info right? So what I think i''m looking for is a way to overload the User.relationships so that I can return a list of Relationships that I compiled by making two queries, one on each column? I can think of some other options that might work in this instance (since i know there is always two rows of data I can just query on 1 column, and then in the Relationship model handle the dual column nature of info), but I think it would still be interesting to know how to overload the function, or describe this behavior better in my model. I hope this makes sense Thanks -- 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.
pipplo wrote:> I''m working on an app with a friend type system. I currently have > setup like this with 2 tables. > > users table keeps track of users > > user_relationships table keeps track of friendships. Now, there > should be two rows for each relationship. This is to keep track of > the directional nature of the relationship between users. Each time a > relationship is made, both rows should be inserted into the table. > > user_1 user_2 data > user_2 user_1 data[...] That''s not necessarily a great idea. Please see http://www.ruby-forum.com/topic/213468 . Best, -- Marnen Laibow-Koser http://www.marnen.org marnen-sbuyVjPbboAdnm+yROfE0A@public.gmane.org -- 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.
Srikanth Shreenivas
2010-Sep-16 18:27 UTC
Re: Re: has_many and bi-directional relationships
How about something like this: class User < ActiveRecord::Base has_many :relations, :foreign_key => "from_user" end class Relation < ActiveRecord::Base belongs_to :from_user, :class_name => "User", :foreign_key => "from_user" belongs_to :to_user, :class_name => "User", :foreign_key => "to_user" end To print list of all friends of , say, first user ind DB, you can something like this: User.first.relations.all.each { |r| puts r.to_user.name } Here is Migrations for two tables: class CreateUsers < ActiveRecord::Migration def self.up create_table :users do |t| t.string :name t.timestamps end end def self.down drop_table :users end end class CreateRelations < ActiveRecord::Migration def self.up create_table :relations do |t| t.integer :from_user t.integer :to_user # other data specific to relation t.timestamps end end def self.down drop_table :relations end end ***** It may have some gotchas, but can be enhanced. On Thu, Sep 16, 2010 at 11:17 PM, Marnen Laibow-Koser <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org>wrote:> pipplo wrote: > > I''m working on an app with a friend type system. I currently have > > setup like this with 2 tables. > > > > users table keeps track of users > > > > user_relationships table keeps track of friendships. Now, there > > should be two rows for each relationship. This is to keep track of > > the directional nature of the relationship between users. Each time a > > relationship is made, both rows should be inserted into the table. > > > > user_1 user_2 data > > user_2 user_1 data > [...] > > That''s not necessarily a great idea. Please see > http://www.ruby-forum.com/topic/213468 . > > Best, > -- > Marnen Laibow-Koser > http://www.marnen.org > marnen-sbuyVjPbboAdnm+yROfE0A@public.gmane.org > -- > 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org<rubyonrails-talk%2Bunsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org> > . > For more options, visit this group at > http://groups.google.com/group/rubyonrails-talk?hl=en. > >-- 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.
its done here http://railscasts.com/episodes/163-self-referential-association -- 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.