Hi,
I am learning Rails and have run into a bit of difficulty with something
I suspect is not uncommon, but I’m having difficulty getting my point
across to Google.
I have three models in an application designed to track events in time,
one model (a ‘date’ model) has a polymorphic relationship to the other
two (the others are two different kinds of events). The other two models
really aren’t valid without a corresponding date record. I have chosen
to use a polymorphic association over STI because, as I understand it,
STI is a less efficient approach to the same functionality that a
polymorphic association provides.
The polymorphic relationship that links a date record to one of the
event model records is configured and seems to work okay.
During the initial development process, I was performing object
instantiations and other operations for these objects using two steps,
one step to retrieve the event object, and the second step to retrieve
the date object. Creation operations (and others) were the same way, one
step to create a new event object, the next to create a new date object.
In these operations, the polymorphic association was successfully
providing the desired linkage between the relevant records.
It seemed to me that since the event models aren’t valid without a date
model, that the date model should be nested in the event models and the
event models should mediate access to their respective date records.
Therefor when I load one of the event models, it quietly loads its
associated date model. When I want to access the event model’s date, I
ask the event model for it, eg. when = expense.bcdate
The problem I have is that when I am creating a new event record, rails
seems intent on saving the date record before saving the event record,
(which seems to make sense to me), and thus the date record’s
polymorphic _id field winds up empty at the conclusion of the save
sequence. There seeem to be a lot of different ways to approach this and
I have tried a number of different methods to solve this but they’ve
either seemed poorly designed or they’ve ended in failure. I was going
to explain the approaches I’ve taken but as a neophyte, I thought it
might be better to ask for an approach from the experienced rather than
directing attention to getting the junk code I’ve written to work.
For what it’s worth, here’s an abridged version of my models:
class RfBcDate < ActiveRecord::Base
belongs_to :eventage, :polymorphic => true
end
class RfBcExpense < ActiveRecord::Base
has_one :rf_bc_date, :as => :eventage
def bcdate
RfBcDate.first(:conditions => [“eventage_id = ? AND eventage_type =
?”, id, self.class.to_s.pluralize]).bcdate
end
An exception is thrown if this isn’t present during creation
operations
def bcdate=(new_date)
# When called with in a nested model, the enclosing model isn’t
saved yet.
RfBcDate.new(:bcdate => new_date, :eventage_type =>
self.class.to_s.pluralize, :eventage_id => id)
end
end
Thanks,
X.