Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialPatrick Montalto
7,868 PointsActiveRecord through association
I'm having some difficulty understanding the through:
association.
I'm creating a model called Experiments
, which has a Foreign Key to Formula
.
Formulas
also have many Formula Line Items
.
Experiments
also have many Experiment Line Items
.
When the user selects the Formula
for the Experiment
, I want the collection set of Formula Line Items
available for those Experiment Line Items
to be limited to the Formula Line Items
which belong to the selected Formula
.
For example, if Formula A has 4 line items and Formula A was chosen for the Experiment, I would want the Experiment Line Items to only be limited to those 4 Formula Line Items.
Also, the same Formula
can appear in multiple Experiments
, therefore the Formula Line Items
can be referenced by multiple sets of Experiment Line Items
.
It is my understanding that I will have to use a through:
association to achieve this. But I don't quite understand the relationship in ActiveRecord. Do I need to create another model to serve as the join model or do one of the aforementioned models serve as the join model?
4 Answers
Seth Kroger
56,413 PointsSo the question is, do you want the Experiment Line Items updated if there are any changes to the Formula Line Item (which is what would happen with has_many :through) or are you keeping a log of the experiment as it was done and not change them if the procedure for the Formula changes in the future? If it's the second it may be better to copy the Line Items in the ExperimentsController create() method instead of using an association.
Seth Kroger
56,413 PointsFrom what I can see you don't need a 3rd model as a go-between. It does need to be used in conjunction with has_many.
Class Experiment < ActiveRecord::Base
has_one :formula
has_many :formula_line_items, through: :formula
end
It doesn't look like you can directly name the column experiment_line_items but you can alias it with alias_attribute.
Patrick Montalto
7,868 PointsI have an experiment_line_items
table as well as a formula_line_items
table. The model for Experiment
you provided would then associate the formula_line_items
with the Experiment
through the selected Formula
foreign key, but what about the experiment_line_items
? Maybe I am not clear on what I thought I could achieve with it. I see each experiment_line_item
belonging_to an experiment
and also belonging_to a formulation_line_item
through the formula
selected to the given experiment
. Would this make sense? It's kind of a double through relationship.
Knowing this, would the given model you provided have to be modified or would it work ?
class ExperimentLineItem < ActiveRecord::Base
belongs_to :experiment
belongs_to :formula_line_items, through: experiment, through: formula
end
or could the second through: be omitted if the Experiment model you provided is used?
Kevin Korte
28,149 PointsSo I want to make sure I understand this correct first.
Experiments has many experiment line items Formulas has many formula line items
Experiments has many forumulas Formulas belong to experiements
That's the overall relationships?
For clarification, what are the experiment and formula line items? Are these truly different line items? Or can these be combined, because it sounds like each has it's own model but do they need to? Can a line item belong to both experiments and formulas.
Patrick Montalto
7,868 PointsReplied below. I feel like there is definitely an easier way to achieve what I am picturing.
Patrick Montalto
7,868 PointsA Formula has many Formula Line Items.
A Formula has many Experiments.
An Experiment belongs to a Formula. (It's data is based off the Formula it references).
An Experiment has many Experiment Line Items (each Experiment Line Item references the associated Formula Line Item(s)).
For example:
Formula Table
| id | job_request |
|----|-------------|
| 1 | 522 |
| 2 | 523 |
Formula Line Item table
| id | dna | concentration | formula_id |
|----|-----|---------------|------------|
| 1 | C1 | 30 | 1 |
| 2 | C2 | 50 | 1 |
| 3 | C2 | 90 | 2 |
Experiment table
| id | title | formula_id |
|----|--------------|-------------|
| 5 | Experiment 5 | 1 |
| 6 | Experiment 6 | 1 |
Experiment Line Items table
| id | experiment_id | formula_line_item_id | diluted_volume |
|----|---------------|-----------------------|----------------|
| 1 | 5 | 1 | 50 |
| 2 | 5 | 2 | 60 |
| 3 | 6 | 1 | 90 |
| 4 | 6 | 2 | 100 |
As you can see, each Formula Line Item is used as a kind of template for the Experiment Line Items. The Formula serves as sort of a recipe and the Experiment serves as a record of actually carrying out that recipe.
Patrick Montalto
7,868 PointsPatrick Montalto
7,868 PointsI have clarified that the Experiment Line Items should not be updated if changes are made to the Formula Line Items. They are locked at creation. I will instead copy the line items in the ExperimentsController create() method as you mentioned. Thanks!