The app I’m building performs Assessments through a series of Tests
(about 120 tests in total), the results are stored in the join table
Findings.
Below is the has_many throughout association I am using -
class Test
has_many :findings
has_many :assessments, :through => :findings
class Finding
belongs_to :assessment
belongs_to :test
class Assessment
has_many :findings
has_many :tests, :through => :findings
The data in the Test table is primarily static. When I Create a new
Assessment I want to be able populate the Findings table with all
tests in the Test table, as all tests are mandatory as part of the
assessment.
I can get this to partially work, for example -
a = Assessment.create!(:name => ‘assessment1’, :test_ids => [‘1’, ‘2’,
‘3’])
select * from FINDINGS;
±—±--------------±---------------------±------±---------
±--------+
id | test_id | assessment_id | pass | fail | verdict
±—±--------------±---------------------±------±---------
±--------+
1 | 1 | 1 | NULL | NULL |
NULL |
2 | 2 | 1 | NULL | NULL |
NULL |
3 | 3 | 1 | NULL | NULL |
NULL |
But I cannot figure out how to supply all Test id’s to create the full
set of tests in the Findings table
Any help much appreciated!
Thanks
First, I would recommend not using “Test” because it happens to be
module name used by the Ruby Test::Unit. Thus, let’s use class Quiz
for the below explanation. Next, you should be able to do the following:
- create a quiz
quiz = Quiz.create!
- create an assessment
assessment = Assessment.create!
- create a finding
finding = Finding.create!
- associate a quiz and assessment to a finding
finding.quiz = quiz
finding.assessment = assessment
finding.save
- check the quiz side of the association
quiz.findings
quiz.assessments
- check the assessment side of the association
assessment.findings
assessment.quizzes
- check the join model of the association
finding.quiz
finding.assessment
- check the findings table
Finding.all
Next, in the above, one needed to create both ends of the association (i.e. assessment and quiz) for
the above process to work. Next, if you are wanting to associate one or more quizzes to an
assessment, you can do one of the following:
assessment.quizzes << quiz1 # associates a single quiz to this assessment
or
Quiz.all.each { |item| assessment.quizzes << item } # associates all the quizzes to this assessment
or
assessment.quizzes.create! # create a quiz and associate it to this assessment
Lastly, I would recommend referencing “Agile Web Development with Rails 3ed” by Dave Thomas et al
because it covers this information in greater detail.
Good luck,
-Conrad
quiz.findings << finding