Has_many rails association => NoMethodError

时间:2014-11-11 21:11:20

标签: ruby-on-rails ruby ruby-on-rails-4

如果我在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"

我的关联是否错误或存在其他问题?

1 个答案:

答案 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正常工作我有点麻烦!