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.