Search code examples
ruby-on-railsfactory-bot

ActiveModel::MissingAttributeError: can't write unknown attribute `ad_id' with FactoryGirl


I have the following models:

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

And I have defined the following Factories:

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

When I try to do this:

ad = FactoryGirl.create(:ad) I get the following error ActiveModel::MissingAttributeError: can't write unknown attribute ad_id' right in the line where I decide the image association in the ad Factory.

What am I doing wrong here?


Solution

  • When you say:

    has_one :image
    

    Rails expects you to define an ad_id field at the images table. Given the way your associations are organised, I assume you have an image_id and a logo_id a the ads table so instead of:

    class Ad < ActiveRecord::Base
      belongs_to :page
    
      has_one :image
      has_one :logo
    end
    

    You probably mean:

    class Ad < ActiveRecord::Base
      belongs_to :page
      belongs_to :image
      belongs_to :logo
    end
    

    If that's not the case then you need to add ad_id columns to both Image and Logo.