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将引发一个
ActiveRecord::RecordNotSaved
异常,其中as
save
仅根据对象的有效性返回一个
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