如果我在rails中有三个类:
class Item::Part::Element < ActiveRecord::Base
belongs_to :item_part, :foreign_key => 'item_part_id'
self.table_name = 'item_part_elements'
end
class Item::Part < ActiveRecord::Base
has_many :elements
belongs_to :item, :foreign_key => 'item_id'
self.table_name = 'item_parts'
end
class Item < ActiveRecord::Base
has_many :parts
self.table_name = 'item'
end
如果我打电话
@item.parts
它工作正常,但如果我进行以下调用
@item_part.elements
抛出错误
NoMethodError: undefined method "elements"
我的关联是否错误或存在其他问题?
答案 0 :(得分:1)
我认为你需要为这些关联指定类名。如果你没有命名空间,这些就可以开箱即用了。但由于您有Item::Part::Element
而不是简单Element
,因此您必须提供更多ActiveRecord以继续。试试这个:
class Item::Part::Element < ActiveRecord::Base
belongs_to :item_part, :foreign_key => 'item_part_id'
self.table_name = 'item_part_elements'
end
class Item::Part < ActiveRecord::Base
has_many :elements, :class_name => '::Item::Part::Element'
belongs_to :item, :foreign_key => 'item_id'
self.table_name = 'item_parts'
end
class Item < ActiveRecord::Base
has_many :parts, :class_name => '::Item::Part'
self.table_name = 'item'
end
class_names以“::”开头的原因是它告诉ActiveRecord你是命名空间从名称空间结构的顶部(根)开始,而不是相对于当前模型。
老实说,相信@item.parts
正常工作我有点麻烦!