我有以下型号:
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'
。
我在这里做错了什么?
答案 0 :(得分:40)
当你说:
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
列。
答案 1 :(得分:1)
检查您的测试数据库。
就我而言,有时在错误迁移后修改开发数据库后,我并没有修改测试数据库中的列。
答案 2 :(得分:0)
我遇到了同样的错误,花了一段时间才找出解决办法。以防万一这对以后的人有所帮助,这是我的情况以及对我有用的。类名已更改,因为这是为了工作:
我有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
答案 3 :(得分:0)
如果您在运行规范时遇到此错误,则可能是新添加的字段未在测试环境中迁移。所以用下面的命令在测试环境中迁移它
rake db:migrate db:test:prepare