Ruby on rails activerecord未保存关系
我有两门这样的课Ruby on rails activerecord未保存关系,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,我有两门这样的课 class ReducaoZ < ActiveRecord::Base self.table_name = 'reducaoz' has_many :aliquotas, foreign_key: 'reducaoz_id', class_name: 'Aliquota', dependent: :delete_all end class Aliquota < ActiveRecord::Base self.table_name = 'aliq
class ReducaoZ < ActiveRecord::Base
self.table_name = 'reducaoz'
has_many :aliquotas, foreign_key: 'reducaoz_id', class_name: 'Aliquota', dependent: :delete_all
end
class Aliquota < ActiveRecord::Base
self.table_name = 'aliquota'
belongs_to :reducaoz, class_name: 'ReducaoZ'
end
当我试图保存记录时,似乎aliquota
缺少对reduceAOZ
这就是SQL
SQL (23.4ms) INSERT INTO "aliquota" ("aliquota", "basecalculo", "valor") VALUES ($1, $2, $3) RETURNING "id" [["aliquota", "0300"], ["basecalculo", "0.0"], ["valor", "0.0"]]
PG::NotNullViolation: ERROR: null value in column "reducaoz_id" violates not-null constraint
: INSERT INTO "aliquota" ("aliquota", "basecalculo", "valor") VALUES ($1, $2, $3) RETURNING "id"
(1.0ms) ROLLBACK
ActiveRecord::StatementInvalid Exception: PG::NotNullViolation: ERROR: null value in column "reducaoz_id" violates not-null constraint
我错过什么了吗 我认为问题在于它不知道
Aliquota
中链接这两个类的主键是什么。试试这个
class ReducaoZ < ActiveRecord::Base
self.table_name = 'reducaoz'
has_many :aliquotas, primary_key: 'id', foreign_key: 'reducaoz_id', class_name: 'Aliquota', dependent: :delete_all
end
class Aliquota < ActiveRecord::Base
self.table_name = 'aliquota'
belongs_to :reducaoz, class_name: 'ReducaoZ', primary_key: 'reducaoz_id', foreign_key: 'id'
end
什么是红色
哪里定义了reduceAO
管道传输的al
是否已格式化Aliquota
否则我需要更多的代码,因为我看不到被引用的对象
编辑-在评论中进一步澄清后
reducao = ReducaoZ.new
if reducao.save
json_data.aliquotas_list.each_with_index do |al, index|
aliquota = reducao.aliquotas.build
# populate aliquota
aliquota.save
end
end
首先保存
reduceAO
,如果通过验证,则build
aliquota(s)保存时,由于使用了build
方法,它们将立即关联,因此无需重新保存reduceAO
yeah-aliquota.reduceAOZ=一个\u-ReduceAOZ的\u实例\u…我认为在使用reduceAO.aliquota.build
时不需要这个。我有一些其他的模型,我正在使用这个构建
,它工作得很好。但是我试过了,仍然没有成功。你的外键的类名
应该是'reduceaoz'
而不是'Aliquota'
你的reucao
持久化了吗?@Pavan现在,当我尝试reduceao.Aliquota.build
时,它给出了一个reduceaoz
实例@斯巴达,还没有…我坚持在那一点上这也不起作用。。这个要点正好说明了我在做什么1)红色是还原的。我忘了把名字改在这里了。2) reduceAO是在类的基础上定义的,比如reduceAO=reduceAOZ.new
。3) al不是格式化的Aliquota
,因此,我必须通过field@LuizE. 如果ReduceAOZ是new
且未保存,则它没有id
,因此没有id
填充到aliquotas
中。我用如何处理的简短版本编辑了我的答案。我试图在json_data.aliquotas_列表之前保存ReduceAO
。每个带有索引的_都没有成功。我找到的唯一解决方法是在构建Aliquota之前保存并重新加载ReduceAOZ
。丑陋,我know@LuizE. 您也可以使用save代码>将在适当位置修改接收器。不过,我建议在大多数情况下不要这样做,因为save如果失败,code>将引发一个ActiveRecord::RecordNotSaved
异常,其中assave
仅根据对象的有效性返回一个boolean
。你也可以考虑一个看起来适合你的需求。事务块本质上说是执行所有这些操作,如果其中任何操作失败,则回滚数据库。
json_data.aliquotas_list.each_with_index do |al, index|
aliquota = reducao.aliquotas.build
# populate aliquota
red.aliquotas << aliquota
end
red.save!
reducao = ReducaoZ.new
if reducao.save
json_data.aliquotas_list.each_with_index do |al, index|
aliquota = reducao.aliquotas.build
# populate aliquota
aliquota.save
end
end