Rails: استثناء القيد غير الفارغ عند إنشاء نموذج به العديد من خلال الاقتران

تم إنشاؤها على ٢٠ أكتوبر ٢٠١٦  ·  3تعليقات  ·  مصدر: rails/rails

خطوات التكاثر

begin
  require "bundler/inline"
rescue LoadError => e
  $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
  raise e
end

gemfile(true) do
  source "https://rubygems.org"
  gem "rails", github: "rails/rails"
  gem "sqlite3"
end

require "active_record"
require "minitest/autorun"
require "logger"

# This connection will do for database-independent bug reports.
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Base.logger = Logger.new(STDOUT)

ActiveRecord::Schema.define do
  create_table :posts, force: true
  create_table :comments, force: true
  create_table :post_comments do |t|
    t.integer :post_id, null: false
    t.integer :comment_id, null: false
  end
end

class Post < ActiveRecord::Base
  has_many :comments, through: :post_comments
  has_many :post_comments
end

class Comment < ActiveRecord::Base
  has_many :posts, through: :post_comments
  has_many :post_comments
end

class PostComment < ActiveRecord::Base
  belongs_to :post
  belongs_to :comment
end

class BugTest < Minitest::Test
  def test_association_stuff
    assert_instance_of Post, Post.create(comments: [Comment.create])
  end
end

سلوك متوقع

أن الإدخال post_comments يحتوي على post_id ولا ينتهك القيد غير الفارغ. هناك زوجان من المشكلات ذات الصلة 17015 و 16494 ولكن هذا فشل دون استخدام accepts_nested_attributes_for التي يبدو أن المشكلتين الأخريين مرتبطتان بها ، إذا كان هذا خطأ فسيسعدني التحقيق فيه و / أو المساعدة فيه و / أو الحصول عليه الذهاب في تقديم العلاقات العامة.

السلوك الفعلي

تبدأ المعاملة ، ويتم إدراج التعليق ، ويتم تنفيذ المعاملة. تبدأ المعاملة ، ويتم إدراج المنشور ، ويتم إدراج تعليق المنشور ولكن بدون post_id .

BugTest#test_association_stuff:
ActiveRecord::StatementInvalid: SQLite3::ConstraintException: NOT NULL constraint failed: post_comments.post_id: INSERT INTO "post_comments" ("comment_id") VALUES (?)
D, [2016-10-19T22:44:28.638640 #19520] DEBUG -- :    (0.0ms)  begin transaction
D, [2016-10-19T22:44:28.639217 #19520] DEBUG -- :   SQL (0.0ms)  INSERT INTO "comments" DEFAULT VALUES
D, [2016-10-19T22:44:28.639376 #19520] DEBUG -- :    (0.0ms)  commit transaction
D, [2016-10-19T22:44:28.662915 #19520] DEBUG -- :    (0.0ms)  begin transaction
D, [2016-10-19T22:44:28.663491 #19520] DEBUG -- :   SQL (0.0ms)  INSERT INTO "posts" DEFAULT VALUES
D, [2016-10-19T22:44:28.665346 #19520] DEBUG -- :   SQL (0.2ms)  INSERT INTO "post_comments" ("comment_id") VALUES (?)  [["comment_id", 1]]
D, [2016-10-19T22:44:28.665540 #19520] DEBUG -- :    (0.0ms)  rollback transaction

أعدادات النظام

إصدار ريلز : 5.0.0.1 & 4.2.7.1

إصدار روبي : 2.3.1p112 (2016-04-26 مراجعة 54768) [x86_64-darwin15]

activerecord attached PR

التعليق الأكثر فائدة

لقد أمضيت بعض الوقت في البحث في هذا الأمر والمشكلة هي ترتيب طرق has_many لأنه في هذا المثال يتم تحديد اقترانات through قبل الارتباطات التي يمرون بها. توجد هذه المشكلة فقط عندما يتم استدعاء الأساليب بترتيب خاطئ ويوجد قيد فارغ في جدول الربط. ومع ذلك ، أعتقد أنه قد يكون من المفيد التحقق من ذلك عند تحديد الارتباطات.

قد يكون أحد الخيارات هو إضافة فحص للتأكد من أن اقتران through قد تم تحديده بالفعل في حالة وجود قيود فارغة على الجدول وطباعة تحذير. أو بدلاً من ذلك ، يمكننا جمع ArgumentError (مع تحذير الإيقاف أولاً) كما يحدث في حالات أخرى على سبيل المثال. عند تحديد الارتباطات التي تتعارض مع أساليب الواقع المعزز. يسعدني العمل على هذا الأمر ، يرجى إعلامي إذا كان لدى أي شخص تعليقات.

ال 3 كومينتر

لقد أمضيت بعض الوقت في البحث في هذا الأمر والمشكلة هي ترتيب طرق has_many لأنه في هذا المثال يتم تحديد اقترانات through قبل الارتباطات التي يمرون بها. توجد هذه المشكلة فقط عندما يتم استدعاء الأساليب بترتيب خاطئ ويوجد قيد فارغ في جدول الربط. ومع ذلك ، أعتقد أنه قد يكون من المفيد التحقق من ذلك عند تحديد الارتباطات.

قد يكون أحد الخيارات هو إضافة فحص للتأكد من أن اقتران through قد تم تحديده بالفعل في حالة وجود قيود فارغة على الجدول وطباعة تحذير. أو بدلاً من ذلك ، يمكننا جمع ArgumentError (مع تحذير الإيقاف أولاً) كما يحدث في حالات أخرى على سبيل المثال. عند تحديد الارتباطات التي تتعارض مع أساليب الواقع المعزز. يسعدني العمل على هذا الأمر ، يرجى إعلامي إذا كان لدى أي شخص تعليقات.

cih أعتقد أن هذا هو الطريق للذهاب (تحذير الإهمال ، في الوقت الحالي). من الواضح أنها "حالة متطورة" حيث لم يتم التعامل معها من قبل ، لكنها تغيير واضح في السلوك من 3.x إلى 4+. يبدو أن هناك عددًا غير قليل من الأشخاص يضربونه بناءً على المغفلين. ربما ملاحظة في الوثائق أيضا؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات