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