【问题标题】:Rails, formtastic and postgres: NotNullViolationRails、formtastic 和 postgres:NotNullViolation
【发布时间】:2014-09-29 15:25:38
【问题描述】:

这个根本不是谷歌搜索,所以我别无选择,只能用这种脑残来打扰你。

我有 2 个模型,通过 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

那么,怎么了?动作不受限制,但创建不行,更新不行。

【问题讨论】:

    标签: ruby-on-rails postgresql activeadmin formtastic


    【解决方案1】:

    好的,这似乎是已知问题。 它修复了删除连接表的“accepts_nested_attributes_for”

    另外,请确保不要在 has_many: 连接上添加dependent:destroy,否则也会产生错误。 这里有更多信息。 https://github.com/rails/rails/issues/16085

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多