rails中的create_or_update方法

kru*_*hah 25 ruby ruby-on-rails

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
Run Code Online (Sandbox Code Playgroud)

我有这样的代码.我想改进它,以便它使用一个方法,比如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)
Run Code Online (Sandbox Code Playgroud)

如果name数据库中存在,那么它应该更新该对象,否则它应该创建一个新对象.

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

Ju *_*ira 81

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
)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你.作为注释,名称不必再次传入,因为它已经使用名称初始化.此处也不需要哈希括号. (3认同)

Zac*_*lon 9

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

person = Person.find_or_initialize(name: 'name')   
person.update_attributes(other_attrs)
Run Code Online (Sandbox Code Playgroud)


lam*_*utz 6

person = Person.find_by_name(name) || Person.new(:name => name)
person.update_attributes!(:street_address => street_address, :city_name => city_name) #etc etc
Run Code Online (Sandbox Code Playgroud)