Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Best Models Associations suggestions

9 views
Skip to first unread message

rajeevkannav

unread,
Jun 22, 2011, 11:08:14 AM6/22/11
to rubyonra...@googlegroups.com
Hello All
I am working on my new project. in that my requriments are like this

Subjects have many books, book belongs to subjects
Books  have many Chapters, Chapter belongs to Books
Chapter have many pages, page belongs to Chapters
Is that fine or it could be done better Ways

Thanks in advance

jay.ga...@gmail.com

unread,
Jun 22, 2011, 1:21:06 PM6/22/11
to rubyonra...@googlegroups.com
I like has_many through with a CatalogEntry join model.

## example Page call ##

Page.last.chapter.book.subjects.first

## models ##

class CatalogEntry < ActiveRecord::Base
belongs_to :subject
belongs_to :book
end

class Book < ActiveRecord::Base
has_many :catalog_entries
has_many :subjects, :through => :catalog_entries
has_many :chapters
end

class Subject < ActiveRecord::Base
has_many :catalog_entries
has_many :books, :through => :catalog_entries
end

class Chapter < ActiveRecord::Base
belongs_to :book
has_many :pages
end

class Page < ActiveRecord::Base
belongs_to :chapter
end

## seeds.rb ##


subject01 = Subject.create!(:name => 'Subject One')
subject02 = Subject.create!(:name => 'Subject Two')

book01 = Book.create!(:name => 'Book One')
book02 = Book.create!(:name => 'Book Two')

book01_chapter01 = Chapter.create!(:book => book01, :name => 'Chapter One')
book01_chapter02 = Chapter.create!(:book => book01, :name => 'Chapter Two')

book02_chapter01 = Chapter.create!(:book => book02, :name => 'Chapter One')
book02_chapter02 = Chapter.create!(:book => book02, :name => 'Chapter Two')

book01_chapter01_page01 = Page.create!(:chapter => book01_chapter01,
:number => 1)
book01_chapter02_page02 = Page.create!(:chapter => book01_chapter02,
:number => 2)

book02_chapter01_page01 = Page.create!(:chapter => book02_chapter01,
:number => 1)
book02_chapter02_page02 = Page.create!(:chapter => book02_chapter02,
:number => 2)

book01.subjects << subject01
book01.subjects << subject02
book01.save

book02.subjects << subject01
book02.subjects << subject02
book02.save

> --
> You received this message because you are subscribed to the Google
> Groups "Ruby on Rails: Talk" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/rubyonrails-talk/-/T35nCJDJ45YJ.
> To post to this group, send email to rubyonra...@googlegroups.com.
> To unsubscribe from this group, send email to
> rubyonrails-ta...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-talk?hl=en.

Tim Shaffer

unread,
Jun 22, 2011, 2:31:28 PM6/22/11
to rubyonra...@googlegroups.com
On Wednesday, June 22, 2011 1:21:06 PM UTC-4, gallivan wrote:
I like has_many through with a CatalogEntry join model.

Devil's advocate here... what do you gain in this example by using a has_many :through instead of has_and_belongs_to_many? Is one ever really going to neeed to access a CatalogEntry instance?

jay.ga...@gmail.com

unread,
Jun 22, 2011, 9:01:09 PM6/22/11
to rubyonra...@googlegroups.com
There are two things I like about has_many :through. First, it causes me to think about and try to name the relationship. Second, it treats the join model as a first class entity, formalizing the relationship - so i can say book.catalog_entries as well as book.subjects.

Form me, has_and_belongs_to_many obscures rather than reveals relationships so avoided it.

My preference does not define general practice. So let's look at one authority. From The Rails 3 Way, section 7.5.1.

Before proceeding with this section, I must clear my conscience by stating that has_and_belongs_to_many is practically obsolete in the minds of many Rails developers, including the authors of this book. Use has_many :through instead and your life should be a lot easier. The section is preserved in this edition almost exactly as it appeared in the first, because it contains good techniques that enlighten the reader about nuances of Active Record behavior.

That, too, is an opinion. But one probably more broadly founded than mine.

As to a 'need' for CatalogEntry.... You need a join model. HABTM uses a join model. It just elides the fact.

Is the devil's advocate satisfied?
--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/AGK7uvDgf-4J.
Reply all
Reply to author
Forward
0 new messages