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
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.
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
Versi rel : 5.0.0.1 & 4.2.7.1
Versi Ruby : 2.3.1p112 (revisi 26-04-2016 54768) [x86_64-darwin15]
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?
Diperbaiki di https://github.com/rails/rails/pull/27485
Komentar yang paling membantu
Saya telah menghabiskan beberapa waktu untuk melihat ini dan masalahnya adalah urutan metode
has_many
karena dalam contoh ini asosiasithrough
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 menaikkanArgumentError
(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.