剛剛發現一個很有趣的事情,寫 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-C】ios苹果app开发入门object-c例子demo14个实例 一般编程问题 【实例简介】 ios苹果app开发入门,object-c,例子,demo,14个实例 初学者难得的学习实例 【实例截图】 【核心代码】 归档 ├── Air...
在Android应用开发中,数据存储...总的来说,ObjectBox为Android开发者提供了一个高效、便捷的数据存储解决方案,使得数据管理变得更加简单和高效。在实际项目中,合理运用ObjectBox可以显著提升应用的性能和用户体验。
在Unity3D开发中,有时候我们需要处理非Unity...这种方法在大型项目中特别有用,因为它使得数据更新和管理变得更为方便。在实际开发中,你可能还需要添加错误处理、资源清理等额外功能,确保整个流程的稳定性和效率。
此外,还有一些其他的库可以实现Object与XML之间的转换,例如Jackson的`jackson-dataformat-xml`模块,它提供了一个基于Jackson的XML处理器,使得JSON和XML之间的转换变得简单。在选择工具时,需要考虑性能、灵活性...
总的来说,SuperObject是Delphi开发人员处理JSON数据的强大工具,它的易用性和灵活性使得JSON操作变得简单而高效。通过熟练掌握SuperObject,开发者可以在处理JSON数据时节省大量时间和精力,提高代码的可读性和可...
Object Pascal是一种高级编译语言,以严格的强类型特性著称,这意味着在Object Pascal中,数据类型会被严格检查。这种语言支持结构化编程和面向对象编程,其代码具备很好的易读性,并且编译速度快。由于支持使用多个...
2. **GUI工具**:图形用户界面使得复杂的数据库操作变得直观易用,包括创建、修改、查询数据库对象,如表、视图、存储过程等,降低了技术门槛,提高了工作效率。 3. **Oracle数据库管理**:ObjectBrowser10提供了...
在网页开发过程中,我们经常会遇到各种布局问题,其中之一就是`<Object>`标签遮盖`<div>`标签的情况。`<Object>`标签在HTML中用于嵌入外部资源,如Flash、PDF或其他插件,而`<div>`标签则常用于创建页面上的容器或...
X-SuperObject 提供了丰富的 API,使得操作 JSON 对象变得非常直观。ISuperObject 接口提供了诸如 `AsBool`, `AsInt`, `AsFloat`, `AsString`, `AsArray` 和 `AsObject` 等方法,用于访问不同类型的 JSON 值。同时,...
在IT行业中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。SuperObject是一个开源的、高性能的JSON库,专门为Delphi和FreePascal设计。...
在Unity游戏引擎中,ScriptableObject是一种非常重要的工具类,它允许开发者创建自定义的数据资产,这些资产可以在项目中被多个脚本或者场景共享。ScriptableObject不是继承自MonoBehaviour,因此它们不会附加到游戏...
**Delphi SuperObject 深度解析:解决中文乱码问题** 在 Delphi 开发环境中,SuperObject 是一个广泛使用的 JSON 解析和序列化库,它提供了高效且易用的接口来处理 JSON 数据。然而,当涉及到处理包含中文字符的 ...
**Object Dock音量插件详解** Object Dock是一款流行的桌面美化工具,它允许用户自定义桌面启动栏,提高工作和娱乐的效率。...如果你是Object Dock的使用者,不妨试试这个插件,让桌面管理变得更加得心应手。
C#作为.NET框架的一部分,提供了丰富的类库和工具,使得与MapObject集成变得容易。开发者可以利用.NET的事件驱动模型,响应用户的操作,如鼠标点击和键盘输入,来控制地图的行为。此外,C#的面向对象特性也有助于...
总结来说,SuperObject是Delphi开发者处理JSON数据的理想选择,它通过直观的API和丰富的功能,使得JSON的解析和生成变得简单易行。无论是从JSON文件读取数据,还是将应用程序的内部状态输出为JSON,SuperObject都能...
"SuperObject1.26" 是一个开源的 Delphi 库,主要用来处理 JSON(JavaScript Object Notation)数据格式。JSON 是一种轻量级的数据交换格式,被广泛应用于 Web 服务和应用程序之间的数据通信。SuperObject 提供了一...
《Visual Object Net++:探索Petri网建模与仿真》 Visual Object Net++是一款专为初学者设计的模拟软件,其主要功能在于提供一个友好的环境来构建和分析Petri网模型。Petri网,全称是Place/Transition Net,是一种...
SUBMODULAR VIDEO OBJECT PROPOSAL SELECTION FOR SEMANTIC OBJECT SEGMENTATION Tinghuai Wang Nokia Labs, Nokia Technologies, Finland
在ATL项目中,Auto Object Map是一个关键的概念,它帮助开发者管理对象的创建和生命周期,使得对象注册和实例化过程更加便捷。在本教程中,我们将深入探讨如何在Visual Studio 2008环境下模拟ATL建立Auto Object Map...
在Delphi编程环境中,SuperObject是一个非常流行的JSON库,它为开发者提供了高效、灵活的JSON解析和序列化功能。在Delphi XE10.3版本中,SuperObject的兼容性和支持是至关重要的,因为JSON作为一种轻量级的数据交换...