我有以下型号:
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
我已经定义了以下工厂:
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
当我尝试这样做时:
ad = FactoryGirl.create(:ad)我在广告工厂中决定图像关联的行中得到以下错误ActiveModel::MissingAttributeError: can't write unknown attribute ad_id'
。
我在这做错了什么?
当你说:
has_one :image
Rails希望你在ad_id
表中定义一个images
字段。鉴于你的协会的组织方式,我假设你有一个image_id
和一个logo_id
一个ads
表,所以而不是:
class Ad < ActiveRecord::Base
belongs_to :page
has_one :image
has_one :logo
end
你可能意味着:
class Ad < ActiveRecord::Base
belongs_to :page
belongs_to :image
belongs_to :logo
end
如果情况并非如此,则需要将ad_id
列添加到Image
和Logo
。
我遇到了同样的错误,需要一段时间来找出修复方法。为了防止将来有人帮助别人,这是我的方案以及对我有用的东西。类名已被更改,因为这是为了工作:
我有2个命名空间模型:
Pantry::Jar
has_many :snacks, class_name: Pantry::Snack
accepts_nested_attributes_for :snacks
Pantry::Snack
belongs_to :pantry_jar, class_name: Pantry::Jar
当我创建一个带有新零食的新罐子时,我会得到:
ActiveModel::MissingAttributeError: can't write unknown attribute `jar_id'
解决方法是将has_many
更改为更明确的外键:
has_many :snacks, class_name: Pantry::Snack, foreign_key: :pantry_jar_id