注意:以下所有控制檯測試都在Rails 3中運行。您可能會在Rails 1中得到不同的輸出結果,您必須自行運行測試以進行比較。
如果您想了解Active Record幕後發生的事情,讓您的滑軌控制檯非常有用。下面是與非保存的對象會發生什麼:
u = User.new
#<User id: nil, name: nil, created_at: nil, updated_at: nil>
u.assignments.build(:name => "example")
#<Assignment id: nil, name: "example", user_id: nil, created_at: nil, updated_at: nil>
u.save
#SQL (0.2ms) INSERT INTO `users` (`created_at`, `name`, `updated_at`) VALUES ('2012-06-01 19:25:45', NULL, '2012-06-01 19:25:45')
#SQL (0.2ms) INSERT INTO `assignments` (`created_at`, `name`, `updated_at`, `user_id`) VALUES ('2012-06-01 19:25:45', 'example', '2012-06-01 19:25:45', 1)
正如你所看到的,兩者都在同一時間保存新的用戶被保存時。現在讓我們嘗試情景二:
u = User.create!(:name => "test")
#SQL (0.2ms) INSERT INTO `users` (`created_at`, `name`, `updated_at`) VALUES ('2012-06-01 19:27:21', 'test', '2012-06-01 19:27:21')
#<User id: 2, name: "test", created_at: "2012-06-01 19:27:21", updated_at: "2012-06-01 19:27:21">
u.assignments.build(:name => "example")
#<Assignment id: nil, name: "example", user_id: 2, created_at: nil, updated_at: nil>
所以,從這個我們可以得出結論:
如果我做some_user.assignments.build,是分配對象得救嗎?
都能跟得上
如果我不some_user.assignments < < Assignment.new,在分配對象保存?
不,這正是assignments.build所做的,沒有區別。
如果我不some_user.assignments < < Assignment.create,是兩個數據庫調用製作,或只是一個?
只是任務。
如果我在創建它並將它添加到some_user.assignments之間修改了Assignment對象,那麼怎麼辦?
不明白,對不起。
如果我保存會怎麼樣!其相應用戶尚未保存在數據庫中的Assignment對象?
它被保存到沒有user_id的數據庫中。然後,當您調用用戶保存時,會向該分配發出更新命令以添加用戶標識。這是在控制檯:
u = User.new(:name => "John Doe")
#<User id: nil, name: "John Doe", created_at: nil, updated_at: nil>
a = Assignment.new(:name => "test")
#<Assignment id: nil, name: "test", user_id: nil, created_at: nil, updated_at: nil>
u.assignments << a
#[#<Assignment id: nil, name: "test", user_id: nil, created_at: nil, updated_at: nil>]
a.save!
#SQL (0.2ms) INSERT INTO `assignments` (`created_at`, `name`, `updated_at`, `user_id`) VALUES ('2012-06-01 19:33:24', 'test', '2012-06-01 19:33:24', NULL)
a.user_id
#nil
u.save!
#INSERT INTO `users` (`created_at`, `name`, `updated_at`) VALUES ('2012-06-01 19:33:36', 'John Doe', '2012-06-01 19:33:36')
#UPDATE `assignments` SET `user_id` = 3, `updated_at` = '2012-06-01 19:33:36' WHERE `assignments`.`id` = 3
希望這有助於。
謝謝。當它說孩子被自動保存時,你知道這本書是什麼意思嗎? – Taymon
當然。這意味着孩子在保存父母后自動保存。因此,您不必在保存任務和用戶時調用保存。用戶同時也會自動保存分配,但在保存用戶之前不會自動保存。 – roflmao