rails 弱依赖关系的一对多
来源:互联网 发布:mac mini顶配 编辑:程序博客网 时间:2024/05/16 16:20
背景:本篇讨论的是弱依赖关系的一对多,也就是删掉主表纪录,无需删掉子表纪录,只需将子表的外键设为NULL. 明星和经纪公司刚好属于这一关系。
模型代码如下:
以一个测试用例作为说明
开头:
测试读取:
测试通过,该经纪公司只包含一个明星:谭咏麟
测试新增:
测试通过,为新增的经纪公司添加了两个明星
测试修改:
测试通过,对经纪公司的明星修改
测试删除:
测试通过
总结:
问题1)
删除测试看起来非常奇怪
@agent.star_ids=[ ]这一句显得很多余。
如果不加这一句,会报外键约束错误。
起初我通过将模型如下配置
删除的问题确实解决了,主表纪录删掉,子表相应外键设为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一样
模型代码如下:
class Agent < ActiveRecord::Base
has_many :stars
# ,:dependent =>:nullify
end
has_many :stars
# ,:dependent =>:nullify
end
以一个测试用例作为说明
开头:
class AgentTest < Test::Unit::TestCase
fixtures :agents,:stars
def setup
@agent = Agent.find(1)
end
..........................................
fixtures :agents,:stars
def setup
@agent = Agent.find(1)
end
..........................................
测试读取:
def test_read
stars = @agent.stars
assert_equal 1 , stars.length
assert_equal "谭咏麟" , stars[0].name_cn
end
stars = @agent.stars
assert_equal 1 , stars.length
assert_equal "谭咏麟" , stars[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
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 1 , @agent.stars.length
assert_equal "张国荣", @agent.stars[0].name_cn
end
@agent.star_ids=[2]
@agent.save
assert_equal 1 , @agent.stars.length
assert_equal "张国荣", @agent.stars[0].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
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 ,:dependent =>:nullify
end
has_many :stars ,:dependent =>:nullify
end
删除的问题确实解决了,主表纪录删掉,子表相应外键设为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一样
- rails 弱依赖关系的一对多
- Rails中嵌套表单的解决:模型关系是一对一和一对多的情况
- rails中模型的关联关系 一对一、一对多、多对多及named_scope
- rails中模型的关联关系 一对一、一对多、多对多及named_scope
- Hibernate 一对多的关系
- nhibernate的一对多关系
- sqlalchemy 的一对多关系
- Hibernate一对多的关系
- Android中设计模式--观察者模式(一对多的关系,对象改变时依赖者都会收到通知)
- Ruby on rails开发从头来(五十六)- ActiveRecord基础(一对多关联关系)
- Ruby on rails开发从头来(五十六)- ActiveRecord基础(一对多关联关系)
- Hibernate中一对多的映射关系
- Hibernate一对多关系的配置
- ssh中一对多关系的配置
- 关联映射的关系(一对多)
- 模型间的一对多关系
- hibernate基于主键的一对多关系
- hibernate中一对多关系的映射
- Struts2 + Spring 2 集成配置
- 商城中,购物车的实现(DataTable和Session)
- OpenCms6.0新手上路——安装篇
- [学习]网络
- .Net平台下开发中文语音应用程序
- rails 弱依赖关系的一对多
- JS不提示关闭IE窗口
- C#随机生成中文字符串
- wml初探
- C#模拟死锁问题
- VB精编:编写高质量的VB代码
- 配置Tomcat5.5.4数据库连接池
- Normal IOCP 的使用
- 利用Ajax实现DataGrid无刷新分页