метод create_or_update в рельсах - PullRequest
23 голосов
/ 11 июня 2010
if ClassName.exists?(["id = ?", self.id])
  object = ClassName.find_by_name(self.name)
  object.update_attributes!( :street_address => self.street_address,
    :city_name => self.city_name,
    :name => self.org_unit_name,
    :state_prov_id => self.state_prov_id,
    :zip_code => self.zip_code)
else
  ClassName.create! :street_address => self.street_address,
    :city_name => self.city_name,
    :federalid => self.federalid,
    :name => self.org_unit_name,
    :state_prov_id => self.state_prov_id,
    :zip_code => self.zip_code
end

У меня есть такой код.Я хотел бы улучшить его, чтобы он использовал метод, например, create_or_update.

    ClassName.create_or_update_by_name(:name => self.name,
    :street_address => self.street_address,
    :city_name => self.city_name,
    :federalid => self.federalid,
    :name => self.org_unit_name,
    :state_prov_id => self.state_prov_id,
    :zip_code => self.zip_code)

Если в базе данных существует name, то он должен обновить этот объект, в противном случае он должен создать новый объект.

Существует ли какой-нибудь метод, с помощью которого я могу сделать это?

Ответы [ 3 ]

79 голосов
/ 11 июня 2010
my_class = ClassName.find_or_initialize_by_name(name)

my_class.update_attributes(
   :street_address => self.street_address,
   :city_name => self.city_name,
   :federalid => self.federalid,
   :state_prov_id => self.state_prov_id,
   :zip_code => self.zip_code
)
8 голосов
/ 30 апреля 2014

Проверенный ответ выше работает хорошо для Rails 3. При этом методы find_or_initialize_by_attribute устарели в Rails 4. Это новый способ. См. Rails4 Предупреждение об устаревании метода find_or_initialize_by

person = Person.find_or_initialize(name: 'name')   
person.update_attributes(other_attrs)
6 голосов
/ 11 июня 2010
person = Person.find_by_name(name) || Person.new(:name => name)
person.update_attributes!(:street_address => street_address, :city_name => city_name) #etc etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...