This has me scratching my head: a Person has many Things a Person has many Collections a Collection has many Things ...Things in a Collection are ordered ...Things in a Collection can be related to (created by) any User ...a collection has additional attributes, such as a name etc I am confused about habtm in rails (especially when using acts_as_habtm_list) vs. going the :through route. Please tell me I am thinking too hard! My current take: -*-*-*-*-*-*-*-* class Person < ActiveRecord::Base has_many :things has_many :collections end class Thing < ActiveRecord::Base belongs_to :person has_and_belongs_to_many :collections, :order => ''position'' end class Collection < ActiveRecord::Base belongs_to :person has_and_belongs_to_many :thing_collections, :order => ''position'' end class ThingCollection < ActiveRecord::Base has_and_belongs_to_many :collections has_and_belongs_to_many :things acts_as_list :scope => :collections end -*-*-*-*-*-*-*-* Is that right? or is it better to do something like this: -*-*-*-*-*- class Person < ActiveRecord::Base has_many :things has_many :collections end class Thing < ActiveRecord::Base belongs_to :person belongs_to :collection has_many :collections, :through => :thing_collections, :order => "position" end class Collection < ActiveRecord::Base belongs_to :person has_many :things, :through => :thing_collections, :order => "position" end class ThingCollection < ActiveRecord::Base belongs_to :collections belongs_to :things acts_as_list :scope => :collection_id end -*-*-*-*-*-* Yes, I am in over my head. Yes, I am smart, and willing to learn. Yes, I want to built something that will last and be flexible... No, I haven''t even moved on past the model, because I wish to understand... Thanks! sudara -- Posted via http://www.ruby-forum.com/.
Sudara, I think you''re thinking too hard. From what you described I don''t think you need such a complicated data model. What is the purpose of ThingCollection? Isn''t Collection a collection of things? Have you read this? http://blog.hasmanythrough.com/articles/2006/04/20/many-to-many-dance-off -Brian On 5/18/06, Sudara <rails@modernthings.net> wrote:> > This has me scratching my head: > > a Person has many Things > a Person has many Collections > a Collection has many Things > ...Things in a Collection are ordered > ...Things in a Collection can be related to (created by) any User > ...a collection has additional attributes, such as a name etc > > > I am confused about habtm in rails (especially when using > acts_as_habtm_list) vs. going the :through route. Please tell me I am > thinking too hard! > > My current take: > -*-*-*-*-*-*-*-* > class Person < ActiveRecord::Base > has_many :things > has_many :collections > end > > class Thing < ActiveRecord::Base > belongs_to :person > has_and_belongs_to_many :collections, :order => ''position'' > end > > class Collection < ActiveRecord::Base > belongs_to :person > has_and_belongs_to_many :thing_collections, :order => ''position'' > end > > class ThingCollection < ActiveRecord::Base > has_and_belongs_to_many :collections > has_and_belongs_to_many :things > acts_as_list :scope => :collections > end > -*-*-*-*-*-*-*-* > > Is that right? > or is it better to do something like this: > > -*-*-*-*-*- > class Person < ActiveRecord::Base > has_many :things > has_many :collections > end > > class Thing < ActiveRecord::Base > belongs_to :person > belongs_to :collection > has_many :collections, :through => :thing_collections, :order => > "position" > end > > class Collection < ActiveRecord::Base > belongs_to :person > has_many :things, :through => :thing_collections, :order => > "position" > end > > class ThingCollection < ActiveRecord::Base > belongs_to :collections > belongs_to :things > acts_as_list :scope => :collection_id > end > -*-*-*-*-*-* > > Yes, I am in over my head. > Yes, I am smart, and willing to learn. > Yes, I want to built something that will last and be flexible... > No, I haven''t even moved on past the model, because I wish to > understand... > > Thanks! > sudara > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-------------- next part -------------- An HTML attachment was scrubbed... URL: http://wrath.rubyonrails.org/pipermail/rails/attachments/20060518/c45bf8f4/attachment-0001.html
The only reason for using habtm instead of :through is it''s simplicity. You don''t need to create a model class for the join table. If you use habtm, the table would be called collections_things (the two tables in alphabetical order). Just using a simple habtm wouldn''t be enough for your purposes though, because you need it to be a list. Now, I don''''t know about acts_as_habtm_list (by the name, it sounds like it might be quite useful for you), but I would do that using :through. Replace all your habtms with has_many... :through => ThingCollection, and you''re set. Hope all that made sense. -Nathan On 18/05/06, Sudara <rails@modernthings.net> wrote:> This has me scratching my head: > > a Person has many Things > a Person has many Collections > a Collection has many Things > ...Things in a Collection are ordered > ...Things in a Collection can be related to (created by) any User > ...a collection has additional attributes, such as a name etc > > > I am confused about habtm in rails (especially when using > acts_as_habtm_list) vs. going the :through route. Please tell me I am > thinking too hard! > > My current take: > -*-*-*-*-*-*-*-* > class Person < ActiveRecord::Base > has_many :things > has_many :collections > end > > class Thing < ActiveRecord::Base > belongs_to :person > has_and_belongs_to_many :collections, :order => ''position'' > end > > class Collection < ActiveRecord::Base > belongs_to :person > has_and_belongs_to_many :thing_collections, :order => ''position'' > end > > class ThingCollection < ActiveRecord::Base > has_and_belongs_to_many :collections > has_and_belongs_to_many :things > acts_as_list :scope => :collections > end > -*-*-*-*-*-*-*-* > > Is that right? > or is it better to do something like this: > > -*-*-*-*-*- > class Person < ActiveRecord::Base > has_many :things > has_many :collections > end > > class Thing < ActiveRecord::Base > belongs_to :person > belongs_to :collection > has_many :collections, :through => :thing_collections, :order => > "position" > end > > class Collection < ActiveRecord::Base > belongs_to :person > has_many :things, :through => :thing_collections, :order => > "position" > end > > class ThingCollection < ActiveRecord::Base > belongs_to :collections > belongs_to :things > acts_as_list :scope => :collection_id > end > -*-*-*-*-*-* > > Yes, I am in over my head. > Yes, I am smart, and willing to learn. > Yes, I want to built something that will last and be flexible... > No, I haven''t even moved on past the model, because I wish to > understand... > > Thanks! > sudara > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
Thanks guys: Brian: As far as I know, *some* extra join model must exist if I want to employ lists. You are right, Collection is a collection of Things. But I would like to take advantage of the ordering built in with acts_as_list or acts_as_hatbm_list, and so my impression is that I need a table with a position column and tell it to acts_as_list That link is great - that is where I came from. Part of it was informative, part of it was over my head and confusing. Nathan: Thanks for the confirmation...I believe what you suggested is working| So, this is what I have: -*-*-*-*- class Thing < ActiveRecord::Base belongs_to :person has_many :collections, :through => :thing_collection, :order => "position" end class Collection < ActiveRecord::Base belongs_to :person has_many :things, :through => :thing_collection, :order => "position" end class ThingCollection < ActiveRecord::Base belongs_to :collection belongs_to :thing acts_as_list :scope => :collection, :order => :position end -*-*-*-*- As far as I understand it, I can use acts_as_list here, specifying that I want to access ThingCollection via Collections as the scope. When I start to move into the controllers, I am not quite clear what the easiest way to access my variables are...but, then again I still have some basic things to learn. For example, I am doing this ugly thing in my Collections controller, in order to make the items in the collection availble for sorting. I *know* there is an easier way. def order @items = ThingCollection.find(:all, :conditions => [ "collection_id=", params[:id]]) end Thanks, sudara -- Posted via http://www.ruby-forum.com/.