rails中的create_or_update方法

时间:2010-06-11 15:18:30

标签: ruby-on-rails ruby

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 个答案:

答案 0 :(得分:79)

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
)

答案 1 :(得分:8)

上面检查的答案适用于Rails 3.这表示在Rails 4中不推荐使用find_or_initialize_by_attribute方法。这是新方法。见Rails4 Deprecation warning for find_or_initialize_by method

person = Person.find_or_initialize(name: 'name')   
person.update_attributes(other_attrs)

答案 2 :(得分:6)

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