Ruby on rails ActiveModel::MissingAttributeError:can';t写入未知属性'ad#u id';和工厂女工

Ruby on rails ActiveModel::MissingAttributeError:can';t写入未知属性'ad#u id';和工厂女工,ruby-on-rails,factory-bot,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 h

我有以下型号:

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
当我尝试这样做时:

ad=FactoryGirl.create(:ad)我得到以下错误
ActiveModel::MissingAttributeError:无法将未知属性ad_id'
写在我决定ad工厂中图像关联的行中

我做错了什么?

当你说:

has_one :image
Rails希望您在
images
表中定义一个
ad\u id
字段。考虑到您的协会的组织方式,我假设您在
广告表中有
图像id
徽标id
a,而不是:

class Ad < ActiveRecord::Base
  belongs_to :page

  has_one :image
  has_one :logo
end
class-Ad
你可能是说:

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

如果不是这样,那么您需要将
ad_id
列添加到
Image
Logo

中,我遇到了同样的错误,花了一段时间才找到解决方法。为了以防万一,这对将来的其他人有帮助,下面是我的情况和对我有效的方法。类名已更改,因为这是为了工作:

我有两个同名模型:

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\u many
更改为更明确的外键:

has_many :snacks, class_name: Pantry::Snack, foreign_key: :pantry_jar_id

检查您的测试数据库


在我的例子中,有时在错误迁移后修改开发数据库后,我没有修改测试数据库中的列。

如果在运行规范时出现此错误,则可能是新添加的字段未在测试环境中迁移。因此,使用下面的命令在测试环境中迁移它

rake db:migrate db:test:prepare

考虑到问题发生在工厂,你没有显示工厂代码,你认为这足够了吗?Mauricio,它只是缺少工厂的属性,但我显示了关联。不管怎样,我已经添加了它们。哦,那很有趣。我之所以说“has_one”,是因为说广告只有一个图像听起来更自然。
has_one
has_many
表示外键位于关联的另一端,
属于它位于当前对象。
属于
has_one
has_many
对底层数据库模式的描述不是很好。
引用
引用
引用_many
会更难被误解。对于那些来这里说,“这类似于我的错误,但我确信我的数据库架构是正确的”。您可能和我一样,您关注的是开发,而不是测试。请确保该字段在测试中迁移。(可能类似于:RAILS\u ENV=test bundle exec rake db:migrate,但您的里程可能会有所不同。)我在某处读了一本很好的助记符,这样我就找不到了。这是用玩具总动员的方法来记住关键词。安迪有一本伍迪的,伍迪属于安迪。外键在哪里?伍迪的脚上!
rake db:migrate db:test:prepare