rub*_*ent 6 ruby ruby-on-rails ruby-on-rails-3
我需要知道Rails dup和clone方法之间的区别,因为dup复制id属性而clone不会:
juan:~/alhambra$ rails c
Loading development environment (Rails 3.0.1)
1.9.3-p551 :001 > @user=User.last
=> #<User id: 2, email: "ferbad12@hotmail.com", encrypted_password: "$2a$10$/Fsz8DZ9PQbReTU1.wyxS.m3IOxZSV3siKDrrtUJdupz...", password_salt: "$2a$10$/Fsz8DZ9PQbReTU1.wyxS.", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-05-06 23:34:20", last_sign_in_at: "2015-05-06 23:34:20", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2015-05-06 23:33:37", updated_at: "2015-05-06 23:34:20">
1.9.3-p551 :002 > @user.clone
=> #<User id: nil, email: "ferbad12@hotmail.com", encrypted_password: "$2a$10$/Fsz8DZ9PQbReTU1.wyxS.m3IOxZSV3siKDrrtUJdupz...", password_salt: "$2a$10$/Fsz8DZ9PQbReTU1.wyxS.", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-05-06 23:34:20", last_sign_in_at: "2015-05-06 23:34:20", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2015-05-06 23:33:37", updated_at: "2015-05-06 23:34:20">
1.9.3-p551 :003 > @user.dup
=> #<User id: 2, email: "ferbad12@hotmail.com", encrypted_password: "$2a$10$/Fsz8DZ9PQbReTU1.wyxS.m3IOxZSV3siKDrrtUJdupz...", password_salt: "$2a$10$/Fsz8DZ9PQbReTU1.wyxS.", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-05-06 23:34:20", last_sign_in_at: "2015-05-06 23:34:20", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2015-05-06 23:33:37", updated_at: "2015-05-06 23:34:20">
Run Code Online (Sandbox Code Playgroud)
num*_*407 12
在rails 3.0中,dup并且clone执行与他们现在所做的相反的角色.来自ActiveRecord :: Base:
克隆的对象没有分配id,并被视为新记录.请注意,这是一个"浅"克隆,因为它只复制对象的属性,而不是它的关联."深度"克隆的范围是特定于应用程序的,因此留给应用程序根据其需要实现.
虽然可以在同一个文件中看到dup简单复制记录及其属性:
def dup
obj = super
obj.instance_variable_set('@attributes', @attributes.dup)
obj
end
Run Code Online (Sandbox Code Playgroud)
这与当前的rails 4不同,后者定义dup并且clone更多地遵循ruby文档中的注释,在类似于rails的特定问题中指出.
通常,clone和dup在后代类中可能具有不同的语义.虽然clone用于复制对象,包括其内部状态,但dup通常使用后代对象的类来创建新实例.
从最新的ActiveRecord源可以看出:
##
# :method: clone
# Identical to Ruby's clone method. This is a "shallow" copy. Be
# warned that your attributes are not copied. That means that modifying
# attributes of the clone will modify the original, since they will both
# point to the same attributes hash. If you need a copy of your attributes
# hash, please use the #dup method.
#
# user = User.first
# new_user = user.clone
# user.name # => "Bob"
# new_user.name = "Joe"
# user.name # => "Joe"
#
# user.object_id == new_user.object_id # => false
# user.name.object_id == new_user.name.object_id # => true
#
# user.name.object_id == user.dup.name.object_id # => false
##
# :method: dup
# Duped objects have no id assigned and are treated as new records. Note
# that this is a "shallow" copy as it copies the object's attributes
# only, not its associations. The extent of a "deep" copy is application
# specific and is therefore left to the application to implement according
# to its need.
# The dup method does not preserve the timestamps (created|updated)_(at|on).
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7363 次 |
| 最近记录: |