当在的has_many关系活动记录对象保存?(When are Active Record obje

2019-07-29 17:15发布

我使用Rails 1.2.3(是的,我知道)和感到困惑的是如何has_many对于工程对象持久性。

例如起见,我将用这个作为我的声明:

class User < ActiveRecord::Base
    has_many :assignments
end

class Assignment < ActiveRecord::Base
    belongs_to :user
end

据我所知,这会产生,除其他外,一个方法User#assignments.build ,它创建一个Assignment对象,其user_id是接收实例的id (而另一字段被作为参数中指定),但不保存该对象在数据库中。 该对象可以在以后通过调用保存Assignment#save!

然而,Pragmatic Programmers的使用Rails进行敏捷Web开发,第二版 ,这是我一直在使用的指导和参考,说:

如果在数据库中存在的父对象,然后添加一个子对象的集合自动保存孩子。

似乎有矛盾吗。 我想知道的是:

  • 如果我做some_user.assignments.build ,是Assignment对象得救吗?
  • 如果我做some_user.assignments << Assignment.new ,是Assignment对象得救吗?
  • 如果我做some_user.assignments << Assignment.create ,是两个数据库调用制作,或只是一个? 那么如果我修改了Assignment创建它并将其添加到对象之间some_user.assignments
  • 如果我发生什么save! 一个Assignment对象,其对应的User还没有被保存在数据库中?

PS我之所以不只是使用User#assignments.create的一切是因为它不会让我出去农场初始化到外部的方法,我希望能够做到这。 我也不想做出多次往返到数据库。

Answer 1:

注:以下所有控制台测试在Rails的3运行。你可能会在导轨1不同的输出,你必须运行测试自己比较。

有你的Rails控制台方便,如果你想了解正在发生的事情与活动记录幕后是非常有价值的。 下面是与非保存的对象会发生什么:

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之间的分配对象?

不明白,抱歉。

如果我救会发生什么! 一个分配对象,其对应的用户还没有被保存在数据库中?

这是一个没有为user_id保存到数据库中。 当你再调用节省您的用户,更新命令发到分配到用户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

希望这可以帮助。



文章来源: When are Active Record objects in has_many relationships saved?