切换导航
首页
技术问答
编程语言
前端开发
移动开发
开发工具
程序设计
行业应用
CMS系统
服务器
频道导航
▸ PHP
▸ Java
▸ Java SE
▸ Python
▸ C#
▸ C&C++
▸ Ruby
▸ VB
▸ asp.Net
▸ Go
▸ Perl
▸ netty
▸ Django
▸ Delphi
▸ Jsp
▸ .NET Core
▸ Spring
▸ Flask
▸ Springboot
▸ SpringMVC
▸ Lua
▸ Laravel
▸ Mybatis
▸ Asp
▸ Groovy
▸ ThinkPHP
▸ Yii
▸ swoole
▸ HTML
▸ HTML5
▸ JavaScript
▸ CSS
▸ jQuery
▸ Bootstrap
▸ Angularjs
▸ TypeScript
▸ Vue
▸ Dojo
▸ Json
▸ Electron
▸ Node.js
▸ extjs
▸ Express
▸ XML
▸ ES6
▸ Ajax
▸ Flash
▸ Unity
▸ React
▸ Flex
▸ Ant Design
▸ Web前端
▸ 微信小程序
▸ 微信公众号
▸ iOS
▸ Android
▸ Swift
▸ Hybrid
▸ Cocos2d-x
▸ Flutter
▸ Xcode
▸ Silverlight
▸ cocoa
▸ Cordova
前端之家
设计模式
rails 弱依赖关系的一对多
rails 弱依赖关系的一对多
2019-06-22
设计模式
前端之家
前端之家
收集整理的这篇文章主要介绍了
rails 弱依赖关系的一对多
,
前端之家
小编觉得挺不错的,现在分享给大家,也给大家做个参考。
背景:本篇讨论的是弱依赖关系的一对多,也就是删掉主表纪录,无需删掉子表纪录,只需将子表的外键设为NULL. 明星和经纪公司刚好属于这一关系。
模型
代码
如下:
@H_
502
_3@
class Agent < ActiveRecord::Base
has_many :stars
#,:dependent =>:nullify
end
以一个测试用例作为说明
开头:
classAgentTest
<
Test
::
Unit
TestCase
fixtures
:
agents
,:
stars
defsetup
@agent
=
Agent
.
find(
1
)
end
..........................................
测试读取:
deftest_read
stars
@agent.stars
assert_equal
"
谭咏麟
0
].name_cn
end
测试通过,该经纪公司只包含一个明星:
谭咏麟
测试新增:
def test_create
new_agent = Agent.new
new_agent.name="索尼"
new_agent.
logo
="http://xxx.com/sony.gif"
new_agent.star_ids=[2,3]
new_agent.save
new_agent = Agent.find(new_agent.id)
assert_equal 2,new_agent.stars.length
assert_equal "刘德华",new_agent.stars[1].name_cn
end
测试通过,为新增的经纪公司
添加
了两个明星
测试
修改
:
def test_update
@agent.star_ids
[
2
]
@agent.save
assert_equal
张国荣
].name_cn
end
测试通过,对经纪公司的明星
修改
测试
删除
:
def test_delete
assert_equal 2,Agent.find(:all).length
@agent.star_ids=[ ]
@agent.destroy
assert_equal 1,Agent.find(:all).length
end
测试通过
总结:
问题1)
删除
测试看起来非常奇怪
@agent.star_ids=[ ]这一句显得很多余。
如果不加这一句,会报外键约束
错误
。
起初我通过将模型如下配置
class Agent < ActiveRecord::Base
has_many :stars,0);">
删除
的问题确实
解决
了,主表纪录删掉,子表相应外键设为null
但是
修改
出现了问题,当我
修改
主表包含的子表纪录时,居然会删掉子表纪录,这个真的很奇怪,
:dependent =>:nullify这个选项在官方文档明明也说不会删掉子表纪录。难道是我用错了?后来我查到rails的wiki确实发现了这个BUG
http://wrath.rubyonrails.org/pipermail/rails-core/2006-June/001660.html
http://dev.rubyonrails.org/ticket/5209
很奇怪这个bug在rails1.1.1就提出了,为什么到我用的1.2.3还没修正 不得已我去掉了那个选项,并在测试
方法
加上
@agent.star_ids=[ ]这一行 问题2) 我
加上
@agent.star_ids=[ ],但并没有
调用
保存,为什么就生效了?我发现如果你
修改
模型实例 的普通
属性
,不保存不会真正操作
数据库
,但如果你
修改
这种关联关系时会透明的持久化,和hibernate一样
上一篇:贯彻TDD
下一篇:TDD的三条军规(Robert C. Martin大
猜你在找的设计模式相关文章
适配器模式-让不兼容的接口得以适配
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合...
作者:前端之家 时间:2021-02-24
策略模式-定义一个算法族
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独...
作者:前端之家 时间:2021-02-24
设计模式之高质量代码
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的...
作者:前端之家 时间:2021-02-24
模板方法模式-封装一套算法流程
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在...
作者:前端之家 时间:2021-02-24
迭代器模式-统一集合的遍历方式
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
作者:前端之家 时间:2021-02-24
单例模式的五种实现方式及优缺点
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
作者:前端之家 时间:2021-02-24
组合模式-统一的处理个别对象与组合对象
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方...
作者:前端之家 时间:2021-02-24
装饰者模式-动态的包装原有对象的行为
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
作者:前端之家 时间:2021-02-24
观察者模式-将消息通知给观察者
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候...
作者:前端之家 时间:2021-02-24
代理模式-访问对象的代理而非其本身
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下...
作者:前端之家 时间:2021-02-24
编程分类
算法
设计模式
多媒体技术
正则表达式
Elasticsearch
Flink
Hadoop
IDE
最新文章
• 适配器模式-让不兼容的接口
• 策略模式-定义一个算法族
• 设计模式之高质量代码
• 模板方法模式-封装一套算法
• 迭代器模式-统一集合的遍历
• 外观模式-简化子系统的复杂
• 单例模式的五种实现方式及
• 组合模式-统一的处理个别对
• 装饰者模式-动态的包装原有
• 观察者模式-将消息通知给观
热门标签
更多 ►
受约束
摘*
day25
Java常用类库
置信
lamda
留存
持续录入
年后
正则表达式30
3.17
regularexpre
匹
多模
适
20130322
基础理论
pathmunge
涵义
reec
tok
需要转义的特
资源分享
validationex
简明魔法
里弄
形如
源码实现
完备
actionscript