has_many question

Hi all,

I need some guidance please.

I have several tables related by "has_many" and I would like to find the
"distant children".

Tables:
Subjects
Books
Chapters
Sections
Subsections
Minisections

They are all related heirarchichally, so book for example is related to
subjects and chapters the following way. All are related the same way.
Book
belongs_to :subject
has_many :chapters

So if I have the subject id, how can I find all the Minisections
belonging to that subject?

Thanks,
Dave

Dave Castellano wrote in post #1126985:

Hi all,

I need some guidance please.

I have several tables related by "has_many" and I would like to find the
"distant children".

Tables:
Subjects
Books
Chapters
Sections
Subsections
Minisections

They are all related heirarchichally, so book for example is related to
subjects and chapters the following way. All are related the same way.
Book
belongs_to :subject
has_many :chapters

So if I have the subject id, how can I find all the Minisections
belonging to that subject?

Database normalization is a good thing... until it isn't. I fear you've
run into one of those situations where de-normalization might be very
useful for the sake of efficiency.

Instead of doing a fully hierarchical structure you could flatten parts
of it. For example your Minisection could have id, subject_id, book_id,
chapter_id, section_id, subsection_id and then:

Minisection
  belongs_to :subject
  belongs_to :book
  belongs_to :chapter
  belongs_to :section
  belongs_to :subsection

Now you can find any list mini-section without using any joins in any
way you see fit.

minisections = Minisection.where({ subject: my_subject, book: my_book,
chapter: my_chapter, section: my_section, subsection: my_subsection }

Thanks Robert,

Unfortunately, a minisection can belong to many books, chapters, ect...
so needs a join table and can't be flattened.

Dave

Please quote the previous message so that the thread can be followed.
This is a mailing list not a forum, though you may be accessing it via
a forum like interface

Unfortunately, a minisection can belong to many books, chapters, ect...
so needs a join table and can't be flattened.

That does not make sense, in your original post you implied
minisection belongs_to subsection, and so on up through the heirarchy.
Therefore any particular minisection is associated with only one
subsection, section, chapter and so on.

Colin

Posted by Colin Law (Guest) on 2013-11-12 14:56
Please quote the previous message so that the thread can be followed.
This is a mailing list not a forum, though you may be accessing it via
a forum like interface

Thanks. Did not know this. I see it in the form of a forum.

Unfortunately, a minisection can belong to many books, chapters, ect...

so needs a join table and can't be flattened.

Posted by Colin Law (Guest) on 2013-11-12 14:56
That does not make sense, in your original post you implied
minisection belongs_to subsection, and so on up through the heirarchy.
Therefore any particular minisection is associated with only one
subsection, section, chapter and so on.

So, original question...
Having several tables related by "has_many" and would like to find the
"distant children".
eg:
Tables:
Subjects
Books
Chapters
Sections
Subsections
Minisections

They are all related heirarchichally, so book for example is related to
subjects and chapters the following way. All are related the same way.
Book
belongs_to :subject
has_many :chapters

So if I have the subject id, how can I find all the Minisections
belonging to that subject without adding all related table id's in each
table?

The below example allows you to jump 2 levels below 'Subject'. Probably you
can try to nest these (I cannot test this right now):

class Subject
  has_many :books
  has_many :chapters, through: :books
end

now subject.chapters should work. Try going further down the hierarchy

Simeon

Simeon Manolov wrote in post #1127415:

The below example allows you to jump 2 levels below 'Subject'. Probably
you
can try to nest these (I cannot test this right now):

class Subject
  has_many :books
  has_many :chapters, through: :books
end

now subject.chapters should work. Try going further down the hierarchy

Simeon

Thank you. I'll give it a try.

Dave