I have the following type of situation: three different models (X, Y,
Z). There is no relationship between X and Y, but Y should have_many
of Z (although I’m not convinced Z should belong_to Y, and it may even
belong_to both Y and X). Instances of Z are created for specific
combinations of X and Y (ie, Z will likely have the fields x_id and
y_id). Z will also contain a name that will be used as an identifier
for an instance Y to an instance of X.
I’m not sure if I should simply have a has_many/belongs_to
relationship between Y and Z, and then search through this subset for
an instance of X (to identify the instance of Y as Z) or if there is a
more eloquent way to achieve this.
Since you want to specify Zs that correspond to an association between
x and y it sounds like the best solution is to introduce a fourth
model to capture the state of the association and then let it be the
owner of the relationship to Z. The canonical example has been the
publishing house that has Customers and Publications; the Subscription
model is introduced to map the association between Customer and
Publication.
In your scenario, it sounds like the following might work:
class X
has_many :xys
has_many :zs, :through=>:xys
end
class Y
has_many :xys
has_many :zs, :through=>:xys
end
class Z
belongs_to :xy
end
class XY
belongs_to :x
belongs_to :y
end
By doing this X and Y have a view into their relationship to one
another and both can see the Zs they know about.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.