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]
لقد أمضيت بعض الوقت في البحث في هذا الأمر والمشكلة هي ترتيب طرق has_many
لأنه في هذا المثال يتم تحديد اقترانات through
قبل الارتباطات التي يمرون بها. توجد هذه المشكلة فقط عندما يتم استدعاء الأساليب بترتيب خاطئ ويوجد قيد فارغ في جدول الربط. ومع ذلك ، أعتقد أنه قد يكون من المفيد التحقق من ذلك عند تحديد الارتباطات.
قد يكون أحد الخيارات هو إضافة فحص للتأكد من أن اقتران through
قد تم تحديده بالفعل في حالة وجود قيود فارغة على الجدول وطباعة تحذير. أو بدلاً من ذلك ، يمكننا جمع ArgumentError
(مع تحذير الإيقاف أولاً) كما يحدث في حالات أخرى على سبيل المثال. عند تحديد الارتباطات التي تتعارض مع أساليب الواقع المعزز. يسعدني العمل على هذا الأمر ، يرجى إعلامي إذا كان لدى أي شخص تعليقات.
cih أعتقد أن هذا هو الطريق للذهاب (تحذير الإهمال ، في الوقت الحالي). من الواضح أنها "حالة متطورة" حيث لم يتم التعامل معها من قبل ، لكنها تغيير واضح في السلوك من 3.x إلى 4+. يبدو أن هناك عددًا غير قليل من الأشخاص يضربونه بناءً على المغفلين. ربما ملاحظة في الوثائق أيضا؟
التعليق الأكثر فائدة
لقد أمضيت بعض الوقت في البحث في هذا الأمر والمشكلة هي ترتيب طرق
has_many
لأنه في هذا المثال يتم تحديد اقتراناتthrough
قبل الارتباطات التي يمرون بها. توجد هذه المشكلة فقط عندما يتم استدعاء الأساليب بترتيب خاطئ ويوجد قيد فارغ في جدول الربط. ومع ذلك ، أعتقد أنه قد يكون من المفيد التحقق من ذلك عند تحديد الارتباطات.قد يكون أحد الخيارات هو إضافة فحص للتأكد من أن اقتران
through
قد تم تحديده بالفعل في حالة وجود قيود فارغة على الجدول وطباعة تحذير. أو بدلاً من ذلك ، يمكننا جمعArgumentError
(مع تحذير الإيقاف أولاً) كما يحدث في حالات أخرى على سبيل المثال. عند تحديد الارتباطات التي تتعارض مع أساليب الواقع المعزز. يسعدني العمل على هذا الأمر ، يرجى إعلامي إذا كان لدى أي شخص تعليقات.