Rails, formtastic and postgres: NotNullViolation



这个根本没有在谷歌上搜索,所以我别无选择,只能用这样的脑筋急转弯来打扰你。

我有两个模型,通过HMT链接。我也有ActiveAdmin。当我尝试从第一个模型创建对象时,postgres会拍摄NotNullViolation,因为rails尝试在不将创建对象的ID实际插入联接表的情况下进行联接。

像这样:

SQL (0.9ms)  INSERT INTO "project_stone_joins" ("stone_id") VALUES ($1)  [["stone_id",2]]
PG::NotNullViolation: ERROR:  null value in column "project_id" violates not-null constraint
DETAIL:  Failing row contains (null, 2).: INSERT INTO "project_stone_joins" ("stone_id") VALUES ($1)
   (0.4ms)  ROLLBACK

关键是:改变做得很好。不开玩笑,陛下,它做得很好。

   (0.3ms)  BEGIN
SQL (0.7ms)  DELETE FROM "project_stone_joins" WHERE "project_stone_joins"."project_id" = $1 AND "project_stone_joins"."stone_id" = 4  [["project_id", 10]]
SQL (0.3ms)  INSERT INTO "project_stone_joins" ("project_id", "stone_id") VALUES ($1, $2)  [["project_id", 10], ["stone_id", 2]]
SQL (0.3ms)  INSERT INTO "project_stone_joins" ("project_id", "stone_id") VALUES ($1, $2)  [["project_id", 10], ["stone_id", 3]]
SQL (0.3ms)  INSERT INTO "project_stone_joins" ("project_id", "stone_id") VALUES ($1, $2)  [["project_id", 10], ["stone_id", 16]]
SQL (0.3ms)  INSERT INTO "project_stone_joins" ("project_id", "stone_id") VALUES ($1, $2)  [["project_id", 10], ["stone_id", 17]]
SQL (0.3ms)  INSERT INTO "project_stone_joins" ("project_id", "stone_id") VALUES ($1, $2)  [["project_id", 10], ["stone_id", 28]]
SQL (0.4ms)  INSERT INTO "project_stone_joins" ("project_id", "stone_id") VALUES ($1, $2)  [["project_id", 10], ["stone_id", 30]]
SQL (0.5ms)  INSERT INTO "project_stone_joins" ("project_id", "stone_id") VALUES ($1, $2)  [["project_id", 10], ["stone_id", 42]]
   (33.5ms)  COMMIT

所以,rails实际上忘记了将我的project_id放在project_stone_joins中。或者我工作过度,看不到什么重要的东西。以下是模型、模式等。

SCHEMA.RB------------------------
  create_table "stones", force: true do |t|
    t.integer  "stone_material_id"
    t.string   "name"
    t.string   "cover_file_name"
    t.string   "cover_content_type"
    t.integer  "cover_file_size"
    t.datetime "cover_updated_at"
    t.boolean  "render"
  end
  create_table "projects", force: true do |t|
    t.string   "name"
    t.integer  "project_group_id"
    t.text     "description"
    t.string   "cover_file_name"
    t.string   "cover_content_type"
    t.integer  "cover_file_size"
    t.datetime "cover_updated_at"
    t.boolean  "ours"
  end
  create_table "project_stone_joins", id: false, force: true do |t|
    t.integer "project_id", null: false
    t.integer "stone_id",   null: false
  end
PROJECT.RB-MODELS--------------------
class Project < ActiveRecord::Base
  belongs_to :project_group
  has_many :project_photos
  has_many :project_stone_joins, dependent: :destroy
  has_many :stones, through: :project_stone_joins
  has_attached_file :cover,
                    styles: {thumb: '100x100#', medium:'300x300#'},
                    default_url: 'project_covers/:style/missing.png'
  validates_attachment_content_type :cover,
                                    content_type: /Aimage/.*Z/
  accepts_nested_attributes_for :project_stone_joins
end
PROJECT.RB-ADMIN------------------
ActiveAdmin.register Project do
  permit_params :name, :project_group_id, :description,
                :cover, :ours, stone_ids:[]
  form do |f|
    f.inputs do
      f.input :project_group
      f.input :stones
      f.input :name
      f.input :description
      f.input :cover, as: :file
      f.input :ours
    end
    f.actions
  end
end
STONE.RB-MODELS---------------------------
class Stone < ActiveRecord::Base
  belongs_to :stone_material
  has_many :stone_photos
  has_many :project_stone_joins, dependent: :destroy
  has_many :projects, through: :project_stone_joins
  has_many :varieties
  has_attached_file :cover,
                    styles: {thumb: '100x100#', medium:'300x300#'},
                    default_url: 'stone_covers/:style/missing.png'
  validates_attachment_content_type :cover,
                                    content_type: /Aimage/.*Z/
  accepts_nested_attributes_for :project_stone_joins
end
STONE.RB-ADMIN------------------------------
ActiveAdmin.register Stone do
  permit_params :name, :stone_material_id, :cover, :render, project_ids: []
  form do |f|
    f.inputs do
      f.input :stone_material
      f.input :name
      f.input :cover, as: :file
      f.input :render
    end
    f.actions
  end
end
PROJECT_STONE_JOIN.RB-MODEL------------------
class ProjectStoneJoin < ActiveRecord::Base
  belongs_to :project
  belongs_to :stone
end

那么,怎么了?操作不受限制,但创建不起作用,更新起作用。

好吧,这似乎是已知的问题。它修复了删除联接表的"accepts_nested_attributes_for"

此外,请确保不要在has_many:joins上添加dependent:destroy,否则也会产生错误。以下是更多信息。https://github.com/rails/rails/issues/16085

相关内容

  • 没有找到相关文章

最新更新