首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建新记录时覆盖原始记录

创建新记录时覆盖原始记录
EN

Stack Overflow用户
提问于 2011-09-14 22:03:38
回答 2查看 217关注 0票数 1
代码语言:javascript
复制
class Company < ActiveRecord::Base
  has_one :ceo, :dependent => :destroy
end

class Ceo < ActiveRecord::Base
  belongs_to :company
end

c = Company.find(1)
c.create_ceo(:name => "Jobless", :age => 46, :gender => "male") # This will create a new CEO named "Jobless"
c.create_ceo(:name => "Baldmer", :age => 56, :gender => "male") # This will create a new CEO named "Baldmer"

一旦创建了第二个首席执行官,第一个首席执行官的company_id设置为零,那么一旦创建了第二个首席执行官,我如何从数据库中删除第一个首席执行官呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-14 22:18:00

当分配新的值时,:dependent => :destroy不会销毁旧的首席执行官记录。所做的全部工作就是在公司对象被销毁的情况下销毁对象。

如果您只是简单地更改Ceo,您可以更改现有Ceo记录中的字段:

代码语言:javascript
复制
c.ceo.name = "Baldmer"
c.ceo.age = 56
c.ceo.save
# This doesn't create a new record, it simply changes the only already in place

或者下面的命令,这两个命令都会更改属性,并在一次操作中保存记录。

代码语言:javascript
复制
c.ceo.update_attributes({:name => "Baldmer", :age => 56, :gender => "male"})

或者在创建新的记录后显式销毁旧的首席执行官记录:

代码语言:javascript
复制
c = Company.find(1)
jobless = c.create_ceo(:name => "Jobless", :age => 46, :gender => "male")
baldmer = c.create_ceo(:name => "Baldmer", :age => 56, :gender => "male")

jobless.destroy     # you need to explicitly destroy this Ceo record.

另外,如果您继续使用已有的内容,并且有兴趣获得数据库中的CEO列表,但当前未在公司工作,则可以这样做:

代码语言:javascript
复制
 > ceos_without_companys = Ceo.find(:all, :conditions => ":company_id = nil")
=> ["<#Ceo, :name => "Jobless", :age => 46, :gender => "male">]
票数 2
EN

Stack Overflow用户

发布于 2011-09-15 02:13:54

试试这个:

代码语言:javascript
复制
class Company < ActiveRecord::Base
  has_one :ceo, :dependent => :destroy

  def assign_ceo options ={}
    Company.transaction do
      ceo.try(:destroy)
      create_ceo(options)
    end
  end
end

现在:

代码语言:javascript
复制
company.assign_ceo(:name => "Foo", ...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7417640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档