I have been having trouble setting up some relations. I want to be able to do this: user.contact_items # an array of addresses, websites, phone numbers, etc. user.addresses # an array of addresses user.websites # an array of websites user.phone_numbers # an array of phone numbers etc. and the same for businesses, charities, etc. Since users, businesses, and charities all can have multiple contact items I assume a polymorphic relation makes sense. I also want to be able to do address.owner # a user, business, or charity website.owner # a user, business, or charity phone_number.owner # a user, business, or charity etc. After much searching, reading and experimenting, my head is beginning to hurt. Can someone get me pointed in the right direction? How do I setup my models? Will it be possible to add fields to my join table so I can flag contact items with things like verified, public, labels, etc? OWNERS --------------------------------------------------- class Users has_many ??? belongs_to ??? class Businesses has_many ??? belongs_to ??? class Charities has_many ??? belongs_to ??? JOIN TABLE --------------------------------------------------- class ContactItems has_many ??? belongs_to ??? #public:boolean #verified:boolean #label:string CONTACT ITEMS --------------------------------------------------- class Addresses has_many ??? belongs_to ??? class EmailAddresses has_many ??? belongs_to ??? class PhoneNumbers has_many ??? belongs_to ??? class Websites has_many ??? belongs_to ??? --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Maybe the below will help. I also know that railsenvy has a good video on this. First of all, it is the tables and associations that are plural, not the classes. I suggest that you would use single table inheritance for the users business etc. You need to have a type column defined in the owners table to signify class for the record Here''s my suggestion: class Owner < ActiveRecord::Base has_many :addresses, :through => :contact_items has_many :websites, :through => :contact_items has_many :phone_numbers, :through => :contact_items end class User < Owner end class Business < Owner end class Charities < Owner end # migration create_table :owners do |t| ... t.string :type end Polymorphic Association could be is solved like this class ContactItem < ActiveRecord::Base belongs_to :owners belongs_to :contacts, :polymorphic => true end # migration create_table :contact_item do |t| ... t.string :contact_type t.integer :contact_id end class Address < ActiveRecord::Base has_one :owner, :thorugh => :contact_items end class EmailAddress < ActiveRecord::Base has_one :owner, :thorugh => :contact_items end class PhoneNumber < ActiveRecord::Base has_one :owner, :thorugh => :contact_items end class Website < ActiveRecord::Base has_one :owner, :thorugh => :contact_items end You can use either belongs_to or has_one on the above classes On Jan 8, 7:36 am, scott <scot...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I have been having trouble setting up some relations. > > I want to be able to do this: > > user.contact_items # an array of addresses, websites, phone > numbers, etc. > user.addresses # an array of addresses > user.websites # an array of websites > user.phone_numbers # an array of phone numbers > etc. > > and the same for businesses, charities, etc. > > Since users, businesses, and charities all can have multiple contact > items I assume a polymorphic relation makes sense. > > I also want to be able to do > address.owner # a user, business, or charity > website.owner # a user, business, or charity > phone_number.owner # a user, business, or charity > etc. > > After much searching, reading and experimenting, my head is beginning > to hurt. Can someone get me pointed in the right direction? How do I > setup my models? Will it be possible to add fields to my join table so > I can flag contact items with things like verified, public, labels, > etc? > > OWNERS > --------------------------------------------------- > class Users > has_many ??? > belongs_to ??? > > class Businesses > has_many ??? > belongs_to ??? > > class Charities > has_many ??? > belongs_to ??? > > JOIN TABLE > --------------------------------------------------- > class ContactItems > has_many ??? > belongs_to ??? > #public:boolean > #verified:boolean > #label:string > > CONTACT ITEMS > --------------------------------------------------- > class Addresses > has_many ??? > belongs_to ??? > > class EmailAddresses > has_many ??? > belongs_to ??? > > class PhoneNumbers > has_many ??? > belongs_to ??? > > class Websites > has_many ??? > belongs_to ???--~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
End the link to railsenvy video tutorial: http://www.railsenvy.com/2007/8/8/activerecord-tutorial On Jan 8, 7:36 am, scott <scot...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I have been having trouble setting up some relations. > > I want to be able to do this: > > user.contact_items # an array of addresses, websites, phone > numbers, etc. > user.addresses # an array of addresses > user.websites # an array of websites > user.phone_numbers # an array of phone numbers > etc. > > and the same for businesses, charities, etc. > > Since users, businesses, and charities all can have multiple contact > items I assume a polymorphic relation makes sense. > > I also want to be able to do > address.owner # a user, business, or charity > website.owner # a user, business, or charity > phone_number.owner # a user, business, or charity > etc. > > After much searching, reading and experimenting, my head is beginning > to hurt. Can someone get me pointed in the right direction? How do I > setup my models? Will it be possible to add fields to my join table so > I can flag contact items with things like verified, public, labels, > etc? > > OWNERS > --------------------------------------------------- > class Users > has_many ??? > belongs_to ??? > > class Businesses > has_many ??? > belongs_to ??? > > class Charities > has_many ??? > belongs_to ??? > > JOIN TABLE > --------------------------------------------------- > class ContactItems > has_many ??? > belongs_to ??? > #public:boolean > #verified:boolean > #label:string > > CONTACT ITEMS > --------------------------------------------------- > class Addresses > has_many ??? > belongs_to ??? > > class EmailAddresses > has_many ??? > belongs_to ??? > > class PhoneNumbers > has_many ??? > belongs_to ??? > > class Websites > has_many ??? > belongs_to ???--~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
It looks like that is an option that might work, but is there a way to do this without using single table inheritance? Is it possible to do something like this in rails? Owners ---------------------------------------------------------- class User < ActiveRecord::Base has_many :contact_items, :through => :contact_links has_many :addresses, :through? => :contact_links?, :as? => :contact_items? has_many :... end class Business < ActiveRecord::Base has_many :contact_items, :through => :contact_links has_many :... end class Charity < ActiveRecord::Base has_many :contact_items, :through => :contact_links has_many :... end Double Polymorphic Join Model??? ---------------------------------------------------------- class ContactLink < ActiveRecord::Base # id:int # owner_id:int # owner_type:string # contact_item_id:int # contact_item_type:string belongs_to :owners, :polymorphic => true belongs_to :contact_items, :polymorphic => true end Contact Items ---------------------------------------------------------- class Address < ActiveRecord::Base has_one :owner, :through => :contact_links end class EmailAddress < ActiveRecord::Base has_one :owner, :through => :contact_links end class PhoneNumber < ActiveRecord::Base has_one :owner, :through => :contact_links end On Jan 8, 3:58 am, stonefield <knut.stenm...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Maybe the below will help. I also know that railsenvy has a good video > on this. > > First of all, it is the tables and associations that are plural, not > the classes. > I suggest that you would use single table inheritance for the users > business etc. > You need to have a type column defined in the owners table to signify > class for the record > > Here''s my suggestion: > > class Owner < ActiveRecord::Base > has_many :addresses, :through => :contact_items > has_many :websites, :through => :contact_items > has_many :phone_numbers, :through => :contact_items > end > class User < Owner > end > class Business < Owner > end > class Charities < Owner > end > > # migration > create_table :owners do |t| > ... > t.string :type > end > > Polymorphic Association could be is solved like this > > class ContactItem < ActiveRecord::Base > belongs_to :owners > belongs_to :contacts, :polymorphic => true > end > > # migration > create_table :contact_item do |t| > ... > t.string :contact_type > t.integer :contact_id > end > > class Address < ActiveRecord::Base > has_one :owner, :thorugh => :contact_items > end > > class EmailAddress < ActiveRecord::Base > has_one :owner, :thorugh => :contact_items > end > class PhoneNumber < ActiveRecord::Base > has_one :owner, :thorugh => :contact_items > end > class Website < ActiveRecord::Base > has_one :owner, :thorugh => :contact_items > end > > You can use either belongs_to or has_one on the above classes > > On Jan 8, 7:36 am, scott <scot...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > I have been having trouble setting up some relations. > > > I want to be able to do this: > > > user.contact_items # an array of addresses, websites, phone > > numbers, etc. > > user.addresses # an array of addresses > > user.websites # an array of websites > > user.phone_numbers # an array of phone numbers > > etc. > > > and the same for businesses, charities, etc. > > > Since users, businesses, and charities all can have multiple contact > > items I assume a polymorphic relation makes sense. > > > I also want to be able to do > > address.owner # a user, business, or charity > > website.owner # a user, business, or charity > > phone_number.owner # a user, business, or charity > > etc. > > > After much searching, reading and experimenting, my head is beginning > > to hurt. Can someone get me pointed in the right direction? How do I > > setup my models? Will it be possible to add fields to my join table so > > I can flag contact items with things like verified, public, labels, > > etc? > > > OWNERS > > --------------------------------------------------- > > class Users > > has_many ??? > > belongs_to ??? > > > class Businesses > > has_many ??? > > belongs_to ??? > > > class Charities > > has_many ??? > > belongs_to ??? > > > JOIN TABLE > > --------------------------------------------------- > > class ContactItems > > has_many ??? > > belongs_to ??? > > #public:boolean > > #verified:boolean > > #label:string > > > CONTACT ITEMS > > --------------------------------------------------- > > class Addresses > > has_many ??? > > belongs_to ??? > > > class EmailAddresses > > has_many ??? > > belongs_to ??? > > > class PhoneNumbers > > has_many ??? > > belongs_to ??? > > > class Websites > > has_many ??? > > belongs_to ???--~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
google for acts_as_double_polymorphic_join From my app, Table name: linkages id :integer(11) not null, primary key origin_id :integer(11) origin_type :string(20) destin_id :integer(11) destin_type :string(20) In linkage.rb: belongs_to :origin, :polymorphic => true belongs_to :destin, :polymorphic => true acts_as_double_polymorphic_join( :origins => [list your models that can be origins], :destins => [list your models that can be destins] ) Pretty sweet plugin. -- 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
I guess you are using the has_many_polymorphs plugin. http://github.com/fauna/has_many_polymorphs/tree/master looks interesting. i''ll give it a try. thanks, scott On Jan 8, 12:22 pm, Ar Chron <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> google for acts_as_double_polymorphic_join > > From my app, > > Table name: linkages > > id :integer(11) not null, primary key > origin_id :integer(11) > origin_type :string(20) > destin_id :integer(11) > destin_type :string(20) > > In linkage.rb: > > belongs_to :origin, :polymorphic => true > belongs_to :destin, :polymorphic => true > > acts_as_double_polymorphic_join( > :origins => [list your models that can be origins], > :destins => [list your models that can be destins] > ) > > Pretty sweet plugin. > -- > Posted viahttp://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-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
I couldn''t find a complete example of a double polymorphic relationship so I will post what I have in case someone comes across this using Google. It seems to be working so far, but I don''t know if I have everything setup correctly yet. # install as a plugin or as a gem git submodule add git://github.com/fauna/has_many_polymorphs.git vendor/plugins/has_many_polymorphs git submodule init git submodule update # setup the models ruby script/generate model User name:string ruby script/generate model Business name:string ruby script/generate model Charity name:string ruby script/generate model Address street:string street2:string city:string state:string zip:string ruby script/generate model EmailAddress address:string ruby script/generate model Website address:string ruby script/generate model PhoneNumber number:string ruby script/generate model Linkage # edit the linkage migration class CreateLinkages < ActiveRecord::Migration def self.up create_table :linkages do |t| t.references :origin, :polymorphic => true t.references :destin, :polymorphic => true t.timestamps end end def self.down drop_table :linkages end end # add the relationships to the models Origins ---------------------------------------------------------- class User < ActiveRecord::Base has_many_polymorphs :destins, :from => [:addresses, :email_addresses, :phone_numbers, :websites], :through => :linkages end class Business < ActiveRecord::Base has_many_polymorphs :destins, :from => [:addresses, :email_addresses, :phone_numbers, :websites], :through => :linkages end class Charity < ActiveRecord::Base has_many_polymorphs :destins, :from => [:addresses, :email_addresses, :phone_numbers, :websites], :through => :linkages end Double Polymorphic Join Model ---------------------------------------------------------- class Linkage < ActiveRecord::Base # id:int # origin_id:int # origin_type:string # destin_id:int # destin_type:string belongs_to :origin, :polymorphic => true belongs_to :destin, :polymorphic => true acts_as_double_polymorphic_join( :origins => [:users, :businesses, :charities], :destins => [:addresses, :email_addresses, :phone_numbers, :websites] ) end Destins ---------------------------------------------------------- class Address < ActiveRecord::Base has_many_polymorphs :origins, :from => [:users, :businesses, :charities], :through => :linkages end class EmailAddress < ActiveRecord::Base has_many_polymorphs :origins, :from => [:users, :businesses, :charities], :through => :linkages end class PhoneNumber < ActiveRecord::Base has_many_polymorphs :origins, :from => [:users, :businesses, :charities], :through => :linkages end How It Works -------------------------------------------------------- rake db:migrate ruby script/console>> u=User.new >> u.name="Scott" >> u.save >> w=Website.new >> w.address="http://google.com" >> w.save >> u.destins << w >> u.destins=> [#<Website id: 1, address: "http://google.com", created_at: "2009-01-08 21:55:12", updated_at: "2009-01-08 21:55:12">]>> w.origins=> [#<User id: 1, name: "scott", created_at: "2009-01-08 21:54:00", updated_at: "2009-01-08 21:54:00">]>> u.websites=> [#<Website id: 1, address: "http://google.com", created_at: "2009-01-08 21:55:12", updated_at: "2009-01-08 21:55:12">] On Jan 8, 2:27 pm, scott <scot...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I guess you are using the has_many_polymorphs plugin.http://github.com/fauna/has_many_polymorphs/tree/master > > looks interesting. i''ll give it a try. > > thanks, > scott > > On Jan 8, 12:22 pm, Ar Chron <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote: > > > google for acts_as_double_polymorphic_join > > > From my app, > > > Table name: linkages > > > id :integer(11) not null, primary key > > origin_id :integer(11) > > origin_type :string(20) > > destin_id :integer(11) > > destin_type :string(20) > > > In linkage.rb: > > > belongs_to :origin, :polymorphic => true > > belongs_to :destin, :polymorphic => true > > > acts_as_double_polymorphic_join( > > :origins => [list your models that can be origins], > > :destins => [list your models that can be destins] > > ) > > > Pretty sweet plugin. > > -- > > Posted viahttp://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-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
On Jan 8, 5:25 pm, scott <scot...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I couldn''t find a complete example of a double polymorphic > relationship so I will post what I have in case someone comes across > this using Google. It seems to be working so far, but I don''t know if > I have everything setup correctly yet.My last post was wrong. The only place we need to define the relationships is in the join model, the other models can be blank. It is even cleaner now!!! One problem I still have is the "destins" (addresses ,phones ,emails, etc.) can belong to many "origins". I need to make this work as a has_one instead of a has_many. git submodule add git://github.com/fauna/has_many_polymorphs.git vendor/plugins/has_many_polymorphs git submodule init git submodule update ruby script/generate model User name:string ruby script/generate model Business name:string ruby script/generate model Charity name:string ruby script/generate model Address street:string street2:string city:string state:string zip:string ruby script/generate model EmailAddress address:string ruby script/generate model Website address:string ruby script/generate model PhoneNumber number:string ruby script/generate model Linkage class CreateLinkages < ActiveRecord::Migration def self.up create_table :linkages do |t| t.references :origin, :polymorphic => true t.references :destin, :polymorphic => true t.timestamps end end def self.down drop_table :linkages end end Origins ---------------------------------------------------------- class User < ActiveRecord::Base end class Business < ActiveRecord::Base end class Charity < ActiveRecord::Base end Double Polymorphic Join Model ---------------------------------------------------------- class Linkage < ActiveRecord::Base # id:int # origin_id:int # origin_type:string # destin_id:int # destin_type:string belongs_to :origin, :polymorphic => true belongs_to :destin, :polymorphic => true acts_as_double_polymorphic_join( :origins => [:users, :businesses, :charities], :destins => [:addresses, :email_addresses, :phone_numbers, :websites] ) end Destins ---------------------------------------------------------- class Address < ActiveRecord::Base end class EmailAddress < ActiveRecord::Base end class PhoneNumber < ActiveRecord::Base end How It Works -------------------------------------------------------- ruby script/console>> u=User.new >> u.name="Scott" >> u.save >> w=Website.new >> w.address="http://google.com" >> w.save >> u.destins << w >> u.destins=> [#<Website id: 1, address: "http://google.com", created_at: "2009-01-08 21:55:12", updated_at: "2009-01-08 21:55:12">]>> w.origins=> [#<User id: 1, name: "scott", created_at: "2009-01-08 21:54:00", updated_at: "2009-01-08 21:54:00">]>> u.websites=> [#<Website id: 1, address: "http://google.com", created_at: "2009-01-08 21:55:12", updated_at: "2009-01-08 21:55:12">] --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---