Relationships question


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.

Any thoughts/ideas would be appreciated.



X: has_many :zs
Y: has_many :zs
Z: belongs_to :y, belongs_to :x

On Jan 30, 2008 6:12 AM, Simon [email protected] wrote:

Ryan B.

Feel free to add me to MSN and/or GTalk as this email.

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

In your scenario, it sounds like the following might work:

class X
has_many :xys
has_many :zs, :through=>:xys

class Y
has_many :xys
has_many :zs, :through=>:xys

class Z
belongs_to :xy

class XY
belongs_to :x
belongs_to :y

By doing this X and Y have a view into their relationship to one
another and both can see the Zs they know about.