Ruby on rails 在创建新记录时覆盖原始记录 class公司:destroy 结束 类Ceo“Jobless”,:age=>46,:gender=>“male”)#这将创建一个名为“Jobless”的新首席执行官 c、 创建首席执行官(:name=>“Baldmer”,:age=>56,:gender=>“male”)#这将创建一个名为“Baldmer”的新首席执行官
一旦创建了第二个CEO,第一个CEO的公司id设置为零,我如何在创建第二个CEO后从数据库中删除第一个CEO?分配新值时,Ruby on rails 在创建新记录时覆盖原始记录 class公司:destroy 结束 类Ceo“Jobless”,:age=>46,:gender=>“male”)#这将创建一个名为“Jobless”的新首席执行官 c、 创建首席执行官(:name=>“Baldmer”,:age=>56,:gender=>“male”)#这将创建一个名为“Baldmer”的新首席执行官,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,一旦创建了第二个CEO,第一个CEO的公司id设置为零,我如何在创建第二个CEO后从数据库中删除第一个CEO?分配新值时,:dependent=>:destroy不会销毁旧的CEO记录。如果公司对象被销毁,只需销毁Ceo对象 如果您只是更改Ceo,您可以更改现有Ceo记录上的字段: class Company < ActiveRecord::Base has_one :ceo, :dependent => :destroy end class Ceo < ActiveRe
:dependent=>:destroy
不会销毁旧的CEO记录。如果公司对象被销毁,只需销毁Ceo对象
如果您只是更改Ceo,您可以更改现有Ceo记录上的字段:
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"
或者执行以下操作,这两种操作都会更改属性,并一次性保存记录
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
或在创建新记录后明确销毁旧的Ceo记录:
c.ceo.update_attributes({:name => "Baldmer", :age => 56, :gender => "male"})
另一方面,如果你坚持现有的,并且有兴趣获得一份在DB中但目前不为公司工作的CEO名单,你可以:
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=Ceo.find(:all,:conditions=>“:company\u id=nil”)
=>[“失业”,年龄=>46岁,性别=>“男性”>]
试试这个:
> ceos_without_companys = Ceo.find(:all, :conditions => ":company_id = nil")
=> ["<#Ceo, :name => "Jobless", :age => 46, :gender => "male">]
没错。在第一种情况下,您可以使用
c.ceo.update\u attributes
。在第二种情况下,我进一步建议将其包装在事务中,以确保您的数据库保持一致。请参阅。@normalocity,非常感谢,我想知道是否有一种内置机制,在c为公司分配了一个新的CEO,您可以在ActiveRecord对象上使用:保存之前回调来检查CEO是否将要更改(即,它是否在即将保存的属性列表中,并且与旧CEO不同)英译汉如果首席执行官即将更换,那么你就用它来破坏旧记录英译汉恐怕没有“读懂我的心思,自动解决此问题。你必须在某个地方给ActiveRecord一个你想要如何处理事情的提示。但是,还有一个注意事项,在销毁旧的CEO对象之前,请确保检查新属性的有效性(CEO.valid?
),否则可能会出现无效的CEO对象,销毁旧对象,当新CEO对象验证失败时,您的公司将没有CEO(@normalocity,非常感谢您的回复,我想我必须在回调中销毁前任CEO。因此,没有这样一种内置机制,在公司分配新CEO时自动删除原CEO
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
company.assign_ceo(:name => "Foo", ...)