:has_many :through problems

Hi,

I’m fairly new to RoR and I’m having some problems with :has_many and
:through and it’s quite possible that I’m doing something very wrong…

The model - consists of items and the their dependencies. Items can
depend on each other; this is coded through the table ‘deps’ with keys
sub_item_id and super_item_id that refers to the items.id.

E.g.

deps
id,super_item_id,sub_item_id
1 , 1, 2
2 , 1, 3
3 , 2, 3

This means that item 1 has two sub items (namely 2 & 3), item 3 has two
super items (namely 1 & 2).

I use the following model:

class Item < AR::B
has_many :deps
has_many :sub_items, :through => :deps
has_many :super_items, :through => :deps
end

class Dep < AR::B
belongs_to :sub_item, :class_name => ‘Item’, :foreign_key =>
‘sub_item_id’
belongs_to :super_item, :class_name => ‘Item’, :foreign_key =>
‘super_item_id’
end

Whenever I try to access the sub or super items I get an sql error (e.g.
for item 1):

'Unknown column ‘deps.item_id’ in ‘where clause’: SELECT items.* FROM
items INNER JOIN deps ON items.id = deps.sub_item_id WHERE
((deps.item_id = 1))

It would seem that the last ((…)) should have been
((deps.super_item_id = 1)). But I’m not quite sure of how I would have
told the reflection of that key name (super_item_id).

I’ve tried any different variations of this without any luck.

Any clues or hints?

Regards,

  • Jacob

I figured out how to do it:

class Item < AR::B
has_many :sub_deps,
:class_name => ‘Dep’,
:foreign_key_name => ‘super_item_id’,
:source => deps

has_many :super_deps,
:class_name => ‘Dep’,
:foreign_key_name => ‘sub_item_id’,
:source => deps

has_many :sub_items, :through => :deps
has_many :super_items, :through => :deps
end

class Dep < AR::B
belongs_to :sub_item, :class_name => ‘Item’, :foreign_key =>
‘sub_item_id’
belongs_to :super_item, :class_name => ‘Item’, :foreign_key =>
‘super_item_id’
End

If anyone has a more elegant solution let me know. In particular it
would be nice not having to specify :class_name => ‘Dep’ when using
:source. It was also unintuitive to me that I needed two has_many
aliases for :deps but at least now I see why.

Regards,

  • Jacob