rails中的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存在于数据库中,那么它应该更新该对象,否则它应该创建一个新对象。

是否存在我可以使用的任何方法?

 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 ) 

上面检查的答案适用于Rails 3.这表示在Rails 4中不推荐使用find_or_initialize_by_attribute方法。这是新方法。 请参阅find_or_initialize_by方法的Rails4 Deprecation警告

 person = Person.find_or_initialize(name: 'name') person.update_attributes(other_attrs) 
 person = Person.find_by_name(name) || Person.new(:name => name) person.update_attributes!(:street_address => street_address, :city_name => city_name) #etc etc