ActiveModel :: MissingAttributeError:无法使用FactoryGirl编写未知属性"ad_id"

Hom*_*ith 28 ruby-on-rails factory-bot

我有以下型号:

class Ad < ActiveRecord::Base
  belongs_to :page

  has_one :image
  has_one :logo
end

class Page < ActiveRecord::Base
  has_many :logos
  has_many :images
  has_many :ads
end

class Image < ActiveRecord::Base
  belongs_to :page
  has_many :ads
end
Run Code Online (Sandbox Code Playgroud)

我已经定义了以下工厂:

factory :page do
  url 'test.com'
end

factory :image do
  width 200
  height 200
  page
end

factory :ad do
  background 'rgb(255,0,0)'
  page
  image
end
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时:

ad = FactoryGirl.create(:ad)我ActiveModel::MissingAttributeError: can't write unknown attribute ad_id'在广告工厂中决定图像关联的行中出现以下错误.

我在这做错了什么?

Mau*_*res 42

当你说:

has_one :image
Run Code Online (Sandbox Code Playgroud)

Rails希望您ad_idimages表中定义一个字段.鉴于你的协会的组织方式,我假设你有一个image_idlogo_id一对ads表,而不是:

class Ad < ActiveRecord::Base
  belongs_to :page

  has_one :image
  has_one :logo
end
Run Code Online (Sandbox Code Playgroud)

你可能意味着:

class Ad < ActiveRecord::Base
  belongs_to :page
  belongs_to :image
  belongs_to :logo
end
Run Code Online (Sandbox Code Playgroud)

如果不是这样,那么你需要添加ad_id列到两ImageLogo.

  • `has_one`和`has_many`表示外键位于关联的另一端,`belongs_to`表示它位于当前对象. (10认同)
  • `belongs_to`,`has_one`和`has_many`不是对底层数据库模式IMO的描述.`references`和`referenced_by_one`和`referenced_by_many`会更难以误解. (4认同)
  • 对于那些来到这里并说“这与我的错误类似,但我确定我的数据库架构是正确的”的人。您可能和我一样,关注的是开发,而不是测试。确保该字段在测试中迁移。(可能类似于:RAILS_ENV=test bundle exec rake db:migrate,但您的里程可能会有所不同。) (3认同)
  • 我在某处读过一个很好的助记符,但我找不到了。这是记住关键词的玩具总动员方法。安迪“有一个”伍迪,伍迪“属于”安迪。外键在哪里?在伍迪的脚上! (2认同)

Sha*_*que 6

如果您在运行规范时遇到此错误,则可能是新添加的字段未在测试环境中迁移。因此使用以下命令将其迁移到测试环境中

rake db:migrate db:test:prepare
Run Code Online (Sandbox Code Playgroud)