rails 弱依赖关系的一对多

 背景:本篇讨论的是弱依赖关系的一对多,也就是删掉主表纪录,无需删掉子表纪录,只需将子表的外键设为NULL. 明星和经纪公司刚好属于这一关系。

模型代码如下:
class Agent < ActiveRecord::Base
  has_many :stars
  #  ,:dependent =>:nullify
end

以一个测试用例作为说明
开头:
class AgentTest  <  Test :: Unit :: TestCase
  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

测试通过,该经纪公司只包含一个明星: 谭咏麟

测试新增:
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 
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

测试通过

总结:
问题1)
删除测试看起来非常奇怪
@agent.star_ids=[ ]这一句显得很多余。
如果不加这一句,会报外键约束错误。

起初我通过将模型如下配置
class Agent < ActiveRecord::Base
  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一样
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Rails框架编写接口时,可以按照以下步骤进行: 1. 创建一个新的Rails应用程序: 打开终端,导航到项目目录并运行以下命令: ``` rails new api_example cd api_example ``` 2. 创建一个控制器: 运行以下命令创建一个控制器: ``` rails generate controller Api ``` 3. 在控制器中定义接口方法: 打开 `app/controllers/api_controller.rb` 文件,添加如下方法: ```ruby class ApiController < ApplicationController def hello render json: { message: 'Hello, World!' } end def greet name = params[:name] render json: { message: "Hello, #{name}!" } end end ``` 4. 配置路由: 打开 `config/routes.rb` 文件,添加以下路由配置: ```ruby Rails.application.routes.draw do get '/api/hello', to: 'api#hello' post '/api/greet', to: 'api#greet' end ``` 5. 运行应用程序: 在终端中运行以下命令启动Rails服务器: ``` rails server ``` 现在,你的Rails应用程序就有了两个接口:`/api/hello` 和 `/api/greet`。 - GET请求的 `/api/hello` 接口返回一个JSON响应,包含一条简单的问候消息。 - POST请求的 `/api/greet` 接口从请求参数中获取名字,并返回一个包含问候消息的JSON响应。 你可以使用REST客户端(如Postman)或浏览器来访问这些接口,例如: - GET请求:`http://localhost:3000/api/hello` - POST请求:`http://localhost:3000/api/greet`,并在请求体中添加名为`name`的参数。 这样,你就可以使用Rails框架创建一个简单的接口,处理不同的HTTP请求并返回相应的JSON响应。当然,在实际开发中,可能会涉及更复杂的数据处理和业务逻辑,但这个例子可以帮助你快速入门。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值