Метод create_or_update в рельсах
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
существует в базе данных, тогда он должен обновить этот объект, иначе он должен создать новый объект.
Существует ли какой-либо метод, который я могу сделать с помощью?
Ответы
Ответ 1
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
)
Ответ 2
Выбранный ответ выше хорошо работает для 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)
Ответ 3
person = Person.find_by_name(name) || Person.new(:name => name)
person.update_attributes!(:street_address => street_address, :city_name => city_name) #etc etc