`

心愛的 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数据时节省大量时间和精力,提高代码的可读性和可...

    ObjectBrowser10中文版

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

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

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

    Delphi7版本 - X-Superobject

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

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

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

    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都能...

    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

    如何获取object中的属性值

    ### 如何获取Object中的属性值 在开发过程中,经常需要从复杂的对象结构中提取特定的属性值。本文将详细介绍两种常见的方法:通过`JavaScriptSerializer`和`JSON.NET`来获取对象中的属性值。 #### ...

    superobject1.26

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

    模拟ATL建立Auto Object Map

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

Global site tag (gtag.js) - Google Analytics