Forum: Ruby on Rails ActiveRecord - Data Modeling

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Fba7e4a85ab39970c6168db448b836ed?d=identicon&s=25 Celio Motta (Guest)
on 2009-04-13 16:18
(Received via mailing list)
Hello!

I am coming from ASP.NET straight into Rails world and have read some
books and watch many screencasts so I decided to start a project in
Rails and this project is actually a Rails version of my ASP.NET site.
Well, by default Rails uses single PK (althogh I saw some plugins that
allow us creating composite PK with more than one attribute) so I
decide to stick to the idea of PK Rails uses by default. (as of my
understanding, please correct me if I'm wrong). My entities are (some
of them, just to start):

        Semester :semester
        Disciplines :code, :description, :ratio
        Classes :start_time, :end_time, :description, :teacher

The idea is:

    Semester has many Disciplines offered in that semester
    Disciplines has many Classes

Since Disciplines are like a catalog of available disciplines to be
offered in one very semester, I didn't want to repeat disciplines for
each semester with "semester has_many :disciplines" because it would
cause the discipline code and descriptions (which is somewhat big name
of it) to be repeated to every discipline and every semester in
Disciplines Model like this:

In the Semester Model,
:semester_id => 1, lets say its 2009.1
:semester_id => 2, lets say its 2009.2

In the Discipline Model:
:id = > 1, :semester_id => 1, :code => "ADM1004", :description =>
"ADMINISTRATION FOR ENGENEERING", :ratio => 2
:id = > 2, :semester_id => 2, :code => "ADM1004", :description =>
"ADMINISTRATION FOR ENGENEERING", :ratio => 2

So the :code and :description is somewhat redundant and wasting space
on the database and I came up with using a third model to join them
like this:

#Semester.rb
class Semester < ActiveRecord::Base
 has_many :discipline_semesters
 has_many :disciplines, :through => :discipline_semesters
end

#Discipline.rb
class Discipline < ActiveRecord::Base
 has_many :discipline_semesters
 has_many :classes, :through => :discipline_semesters
end

#Class.rb
class Class< ActiveRecord::Base
 belongs_to :discipline_semesters
end

#DisciplineSemester.rb
class DisciplineSemester< ActiveRecord::Base
 has_many :classes
 belongs_to :semester
 belongs_to :discipline
end

Bad thing is somewhat wierd to create new classes for a
DisciplineSemester because it would be something like:

Semester.create!(:semester=> 20091)  - new semester
semester = Semester.find(1) - Get it into a variable
semester.disciplines << Discipline.create!(:code=>
"ADM1004", :description=> "ADMINISTRACAO PARA ENGENHARIA", :ratio=>
4)  - Creates and associates a class with the Semester
discipline = p.disciplines.find_by_code("ADM1004") - Get the
discipline variable
discipline.classes- returns an empty array, none yet
discipline.classes << Class.create!(:code => '33A', :start_time =>
'13h', :end_time => '15h', :description => 'Especial Class For Nerds')
- tries to create an new classe for that disciplina in a semester and
get:

ActiveRecord::HasManyThroughCantAssociateThroughHasManyReflection:
Cannot modify association 'Disciplina#turmas' because the source
reflection class 'Turma' is associated to 'DisciplinaPeriodo'
via :has_many.

So to create a Class for a DisciplineSemester entries which represents
an Discipline offered in a Semester, I must do something like:

   Class.create!(:code => '33A', :start_time => '13h', :end_time =>
'15h', :description => 'Especial Class For
Nerds', :discipline_semester_id => PassHereTheID)

Sorry for the big message but I hope I made myself clear,

Thanks,
This topic is locked and can not be replied to.