Rails: Pengecualian kendala non null saat membuat model dengan memiliki banyak melalui asosiasi

Dibuat pada 20 Okt 2016  ·  3Komentar  ·  Sumber: rails/rails

Langkah-langkah untuk mereproduksi

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

Perilaku yang diharapkan

Bahwa sisipan post_comments memiliki post_id dan tidak melanggar batasan bukan nol. Ada beberapa masalah terkait 17015 dan 16494 tetapi ini gagal tanpa menggunakan accepts_nested_attributes_for yang tampaknya terkait dengan dua masalah lainnya, jika ini adalah bug, saya akan dengan senang hati menyelidiki, membantu, dan/atau memiliki mencoba mengirimkan PR.

Perilaku sebenarnya

Transaksi dimulai, komentar dimasukkan, transaksi dilakukan. Transaksi dimulai, posting dimasukkan, komentar posting dimasukkan tetapi tanpa 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

Sistem konfigurasi

Versi rel : 5.0.0.1 & 4.2.7.1

Versi Ruby : 2.3.1p112 (revisi 26-04-2016 54768) [x86_64-darwin15]

activerecord attached PR

Komentar yang paling membantu

Saya telah menghabiskan beberapa waktu untuk melihat ini dan masalahnya adalah urutan metode has_many karena dalam contoh ini asosiasi through didefinisikan sebelum asosiasi yang mereka lalui. Masalah ini hanya ada ketika metode dipanggil dalam urutan yang salah dan batasan nol ada di tabel gabungan. Namun saya pikir akan berguna untuk memeriksa ini ketika asosiasi didefinisikan.

Sebuah opsi akan menambahkan tanda centang untuk memastikan bahwa asosiasi through telah ditentukan jika memiliki batasan nol pada tabel dan mencetak peringatan. Atau sebagai alternatif, kita dapat menaikkan ArgumentError (dengan peringatan penghentian terlebih dahulu) seperti yang dilakukan dalam kasus lain, mis. ketika mendefinisikan asosiasi yang bertentangan dengan metode AR. Saya akan dengan senang hati mengerjakan ini, beri tahu saya jika ada yang memiliki umpan balik.

Semua 3 komentar

Saya telah menghabiskan beberapa waktu untuk melihat ini dan masalahnya adalah urutan metode has_many karena dalam contoh ini asosiasi through didefinisikan sebelum asosiasi yang mereka lalui. Masalah ini hanya ada ketika metode dipanggil dalam urutan yang salah dan batasan nol ada di tabel gabungan. Namun saya pikir akan berguna untuk memeriksa ini ketika asosiasi didefinisikan.

Sebuah opsi akan menambahkan tanda centang untuk memastikan bahwa asosiasi through telah ditentukan jika memiliki batasan nol pada tabel dan mencetak peringatan. Atau sebagai alternatif, kita dapat menaikkan ArgumentError (dengan peringatan penghentian terlebih dahulu) seperti yang dilakukan dalam kasus lain, mis. ketika mendefinisikan asosiasi yang bertentangan dengan metode AR. Saya akan dengan senang hati mengerjakan ini, beri tahu saya jika ada yang memiliki umpan balik.

@cih Saya percaya itulah rute yang harus ditempuh (peringatan penghentian, untuk saat ini). Ini jelas merupakan "kasus tepi" karena belum pernah ditangani sebelumnya, tetapi ini adalah perubahan perilaku yang pasti dari 3.x ke 4+. Sepertinya ada beberapa orang yang memukulnya berdasarkan penipuan. Mungkin catatan dalam dokumentasi juga?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat