`

心愛的 Object 變心啦

    博客分类:
  • ruby
阅读更多

剛剛發現一個很有趣的事情,寫 code 的時候,有兩個 Model :Person 跟 Setting ,他們呈現 1: 1 關係。結果當我想要創立一個新的 Person 的時候,為了希望能夠簡化設計,我就將其中一個人 a 當作預設值,每個新增 Person 的 Setting 直接 copy 一份過去,所以我就這樣寫




a = Person.find(1)
b = Person.new( :name => 'lala' )
b.setting = a.setting
b.save

我真的沒想太多,但是慘劇就發生了。a.setting 就變心到 b 去了。

>> a = User.find 1
=> #<Person:0x371ee38 @attributes={"updated_at"=>"2007-05-15 22:55:45", "nname"=>"hemidemi lala", "type"=>"GroupAdmin", "id"=>"1", "password"=>"123", "created_at"=>"2007-05-09 00:46:35"}>
>> a.setting
=> nil

也就是他自動的幫你把 a.setting 的 model 裡面的 foreign key 指定到新增的 b ,然後一去不回頭。要預防 object 變心方法也很簡單,就是幫新人找一份完全一模一樣的新伴侶即可。

a = Person.find(1)
b = Person.new( :name => 'lala' )
b.setting = a.setting.clone
b.save

Clone 是 Ruby object 裡面的 method ,作法就是 copy 一份新的 instance。雖然在實際使用上, 其實 clone 並不會直接 new 一份真的 instance,而是 new 一個 object ,然後將裡面 attribute 直接 reference 過去[註1]。但是在 ActiveRecord 裡面使用,因為是直接寫回資料庫,所以就完全沒副作用,所以可以盡量大方的使用。

註1

irb(main):001:0> class Klass
irb(main):002:1> attr_accessor :str
irb(main):003:1> end
irb(main):004:0> s1 = Klass.new => #<Klass:0x89e7c>
irb(main):007:0> s1.str = 'Hello' => "Hello"
irb(main):008:0> s2 = s1.clone => #<Klass:0x79d38 @str="Hello">
irb(main):009:0> s1.object_id => 282430
irb(main):010:0> s2.object_id => 249500
irb(main):011:0> s1.str.object_id => 261360
irb(main):012:0> s2.str.object_id => 261360

我們可以發現到 s1 跟 s2 其實是兩個不同的 object ,但是裡面的 attribute str 卻是同一個 object。



分享到:
评论

相关推荐

    Object-Cios苹果app开发入门object-c例子demo14个实例 一般编程问题

    【Object-C】ios苹果app开发入门object-c例子demo14个实例 一般编程问题 【实例简介】 ios苹果app开发入门,object-c,例子,demo,14个实例 初学者难得的学习实例 【实例截图】 【核心代码】 归档 ├── Air...

    Android 三方数据库ObjectBox使用

    在Android应用开发中,数据存储...总的来说,ObjectBox为Android开发者提供了一个高效、便捷的数据存储解决方案,使得数据管理变得更加简单和高效。在实际项目中,合理运用ObjectBox可以显著提升应用的性能和用户体验。

    Unity3D教程:用ScriptableObject打包数据2

    在Unity3D开发中,有时候我们需要处理非Unity...这种方法在大型项目中特别有用,因为它使得数据更新和管理变得更为方便。在实际开发中,你可能还需要添加错误处理、资源清理等额外功能,确保整个流程的稳定性和效率。

    Object转xml或xml转Object

    此外,还有一些其他的库可以实现Object与XML之间的转换,例如Jackson的`jackson-dataformat-xml`模块,它提供了一个基于Jackson的XML处理器,使得JSON和XML之间的转换变得简单。在选择工具时,需要考虑性能、灵活性...

    superobject.pas

    总的来说,SuperObject是Delphi开发人员处理JSON数据的强大工具,它的易用性和灵活性使得JSON操作变得简单而高效。通过熟练掌握SuperObject,开发者可以在处理JSON数据时节省大量时间和精力,提高代码的可读性和可...

    Object Pascal中文手册(清晰非扫描版)

    Object Pascal是一种高级编译语言,以严格的强类型特性著称,这意味着在Object Pascal中,数据类型会被严格检查。这种语言支持结构化编程和面向对象编程,其代码具备很好的易读性,并且编译速度快。由于支持使用多个...

    ObjectBrowser10中文版

    2. **GUI工具**:图形用户界面使得复杂的数据库操作变得直观易用,包括创建、修改、查询数据库对象,如表、视图、存储过程等,降低了技术门槛,提高了工作效率。 3. **Oracle数据库管理**:ObjectBrowser10提供了...

    网页Object标签遮盖DIV标签解决方法

    在网页开发过程中,我们经常会遇到各种布局问题,其中之一就是`&lt;Object&gt;`标签遮盖`&lt;div&gt;`标签的情况。`&lt;Object&gt;`标签在HTML中用于嵌入外部资源,如Flash、PDF或其他插件,而`&lt;div&gt;`标签则常用于创建页面上的容器或...

    Delphi7版本 - X-Superobject

    X-SuperObject 提供了丰富的 API,使得操作 JSON 对象变得非常直观。ISuperObject 接口提供了诸如 `AsBool`, `AsInt`, `AsFloat`, `AsString`, `AsArray` 和 `AsObject` 等方法,用于访问不同类型的 JSON 值。同时,...

    SuperObject增加排序.rar

    在IT行业中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。SuperObject是一个开源的、高性能的JSON库,专门为Delphi和FreePascal设计。...

    ScriptableObject.zip

    在Unity游戏引擎中,ScriptableObject是一种非常重要的工具类,它允许开发者创建自定义的数据资产,这些资产可以在项目中被多个脚本或者场景共享。ScriptableObject不是继承自MonoBehaviour,因此它们不会附加到游戏...

    Delphi superobject

    **Delphi SuperObject 深度解析:解决中文乱码问题** 在 Delphi 开发环境中,SuperObject 是一个广泛使用的 JSON 解析和序列化库,它提供了高效且易用的接口来处理 JSON 数据。然而,当涉及到处理包含中文字符的 ...

    Object Dock 音量插件

    **Object Dock音量插件详解** Object Dock是一款流行的桌面美化工具,它允许用户自定义桌面启动栏,提高工作和娱乐的效率。...如果你是Object Dock的使用者,不妨试试这个插件,让桌面管理变得更加得心应手。

    用C# MapObject编写的一个GIS程序

    C#作为.NET框架的一部分,提供了丰富的类库和工具,使得与MapObject集成变得容易。开发者可以利用.NET的事件驱动模型,响应用户的操作,如鼠标点击和键盘输入,来控制地图的行为。此外,C#的面向对象特性也有助于...

    SuperObject_delphi_superobject_JSON_jsonparser_dotya_

    总结来说,SuperObject是Delphi开发者处理JSON数据的理想选择,它通过直观的API和丰富的功能,使得JSON的解析和生成变得简单易行。无论是从JSON文件读取数据,还是将应用程序的内部状态输出为JSON,SuperObject都能...

    superobject1.26

    "SuperObject1.26" 是一个开源的 Delphi 库,主要用来处理 JSON(JavaScript Object Notation)数据格式。JSON 是一种轻量级的数据交换格式,被广泛应用于 Web 服务和应用程序之间的数据通信。SuperObject 提供了一...

    Visual Object Net++

    《Visual Object Net++:探索Petri网建模与仿真》 Visual Object Net++是一款专为初学者设计的模拟软件,其主要功能在于提供一个友好的环境来构建和分析Petri网模型。Petri网,全称是Place/Transition Net,是一种...

    Submodular video object proposal selection for semantic object segmentation

    SUBMODULAR VIDEO OBJECT PROPOSAL SELECTION FOR SEMANTIC OBJECT SEGMENTATION Tinghuai Wang Nokia Labs, Nokia Technologies, Finland

    模拟ATL建立Auto Object Map

    在ATL项目中,Auto Object Map是一个关键的概念,它帮助开发者管理对象的创建和生命周期,使得对象注册和实例化过程更加便捷。在本教程中,我们将深入探讨如何在Visual Studio 2008环境下模拟ATL建立Auto Object Map...

    Delphi json superobject 支持XE10.3

    在Delphi编程环境中,SuperObject是一个非常流行的JSON库,它为开发者提供了高效、灵活的JSON解析和序列化功能。在Delphi XE10.3版本中,SuperObject的兼容性和支持是至关重要的,因为JSON作为一种轻量级的数据交换...

Global site tag (gtag.js) - Google Analytics