Перезаписать исходную запись при создании новой - PullRequest
1 голос
/ 14 сентября 2011
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"

После того, как 2-й генеральный директор создан, для первого_компонента company_id установлено значение nil, как я могу удалить 1-го генерального директора из БД после создания 2-го?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

:dependent => :destroy не уничтожает старую запись Ceo, когда назначается новое значение.Все, что нужно, это уничтожить объект Ceo, , в случае, если объект Company уничтожен .

Если вы просто меняете Ceo, вы можете изменить поля в существующей записи Ceo:

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

Или следующее, которое одновременно изменяет атрибуты и сохраняет запись в одном кадре.

c.ceo.update_attributes({:name => "Baldmer", :age => 56, :gender => "male"})

Или явно уничтожает старую 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.

Если вы останетесь с тем, что у вас есть, и вы заинтересованы в получении списка руководителей, которые находятся в БД, но которыев настоящее время не работает для компаний, вы можете сделать:

 > ceos_without_companys = Ceo.find(:all, :conditions => ":company_id = nil")
=> ["<#Ceo, :name => "Jobless", :age => 46, :gender => "male">]
0 голосов
/ 14 сентября 2011

Попробуйте это:

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", ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...