不能得到has_many并强调工作

时间:2013-09-16 14:49:18

标签: ruby-on-rails has-many

我已经堆了好几天,尝试了一切。

我正在尝试做一个简单的有很多关联,但它拒绝工作:

我需要的是每个orb获得与之关联的orb_type。

我生成脚手架:

rails generate scaffold orb_type nome
rails generate scaffold orb nome:string descr:text orb_type_id:integer

制作rake db:migrate,

更改模型:

class Orb < ActiveRecord::Base
  has_many :orb_types
  validates_associated :orb_types
  attr_accessible :descr, :nome, :orb_type_id
  validates :nome, uniqueness: true, presence: true
end

class OrbType < ActiveRecord::Base
  attr_accessible :nome
  validates :nome, uniqueness: true, presence: true
  belongs_to :orb
end

然后试着让它发挥作用:

$ rails c
1.9.3-p448 :001 > tipo = OrbType.new nome: "Planeta"
1.9.3-p448 :002 > tipo.save
1.9.3-p448 :003 > tipo = OrbType.find(1)
1.9.3-p448 :004 > planeta = Orb.new nome:"Testname", descr: "TestDescr"
1.9.3-p448 :005 > planeta.orb_type = tipo

在最后一行我收到错误:

NoMethodError: undefined method `each' for #<OrbType:0x00000003dc02a0>

这笔交易是什么?下划线和轨道“惯例”令我头疼。

我看到了很多其他类似的主题,但他们的解决方案都没有用!

2 个答案:

答案 0 :(得分:2)

orb_type_id模型中设置Orb是问题的一部分。您说Orb有很多OrbTypes,但orb_type_id基本上只允许一个而OrbType属于Orb,这意味着OrbType需要orb_id

假设目标中有多对多关系,那么您很可能需要一个关联模型:

class Orb < ActiveRecord::Base
  has_many :orb_types, :through => :orb_associations
  has_many :orb_accociations
  validates_associated :orb_types
  attr_accessible :descr, :nome, :orb_type_id
  validates :nome, uniqueness: true, presence: true
end

class OrbAccociations < ActiveRecord::Base
  belongs_to :orb
  belongs_to :orb_type
end

class OrbType < ActiveRecord::Base
  attr_accessible :nome
  validates :nome, uniqueness: true, presence: true
  has_many :orb_associations
  has_many :orbs, :through => :orb_associations
end

答案 1 :(得分:2)

你的关系是错误的。 (你的脚手架很好,只需要切换belongs_tohas_many。)

更改模型:

class Orb < ActiveRecord::Base
  belongs_to :orb_type
  validates_associated :orb_types
  attr_accessible :descr, :nome, :orb_type_id
  validates :nome, uniqueness: true, presence: true
end

class OrbType < ActiveRecord::Base
  has_many :orbs
  attr_accessible :nome
  validates :nome, uniqueness: true, presence: true
end

现在可以为一个球体提供一种类型,并且可以为许多球体提供类型。