rails 弱依赖关系的一对多
发布时间:2020-12-13 20:39:44 所属栏目:百科 来源:网络整理
导读:背景:本篇讨论的是弱依赖关系的一对多,也就是删掉主表纪录,无需删掉子表纪录,只需将子表的外键设为NULL. 明星和经纪公司刚好属于这一关系。 模型代码如下: class Agent ActiveRecord::Base has_many :stars #,:dependent =:nullify end 以一个测试用例作
背景:本篇讨论的是弱依赖关系的一对多,也就是删掉主表纪录,无需删掉子表纪录,只需将子表的外键设为NULL. 明星和经纪公司刚好属于这一关系。
模型代码如下:
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一样 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |