gpt4 book ai didi

ruby-on-rails - has_many 关系中的 Active Record 对象何时保存?

转载 作者:行者123 更新时间:2023-12-03 18:23:35 25 4
gpt4 key购买 nike

我正在使用 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! 保存该对象。 .

然而,我一直将其用作教程和引用的 The Pragmatic Programmers' Agile Web Development with Rails, Second Edition 说:

If the parent object exists in the database, then adding a child object to a collection automatically saves that child.



这里似乎有矛盾。我想知道的是:
  • 如果我这样做 some_user.assignments.build ,是 Assignment对象保存?
  • 如果我这样做 some_user.assignments << Assignment.new ,是 Assignment对象保存?
  • 如果我这样做 some_user.assignments << Assignment.create , 是两次调用数据库还是只调用一次?如果我修改 Assignment 会怎样?创建对象和将其添加到 some_user.assignments 之间的对象?
  • 如果我 save! 会发生什么Assignment其对应的对象 User还没有保存在数据库中吗?

  • 附言我不只是使用 User#assignments.create 的原因一切都是因为它不允许我将初始化分配给外部方法,而我希望能够做到这一点。我也不想多次访问数据库。

    最佳答案

    注意:下面的所有控制台测试都在 Rails 3 中运行。您可能会在 Rails 1 中得到不同的输出,您必须自己运行测试以进行比较。

    如果您想了解 Active Record 幕后发生的事情,那么将 Rails 控制台放在手边是非常有值(value)的。以下是未保存对象的情况:

    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 尚未保存在数据库中?

    它在没有 user_id 的情况下保存到数据库中。然后,当您对用户调用 save 时,会向分配发出更新命令以添加用户 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

    希望这可以帮助。

    关于ruby-on-rails - has_many 关系中的 Active Record 对象何时保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10856041/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com