【问题标题】:create_or_update method in railsrails 中的 create_or_update 方法
【发布时间】:2011-03-02 17:27:39
【问题描述】:
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 存在于数据库中,那么它应该更新该对象,否则它应该创建一个新对象。

有没有什么方法可以做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案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
    )
    

    Rails 6 开始,update_attributes!update_attributes is deprecated 分别对应于 update!update

    my_class.update(
       :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
    )
    

    【讨论】:

    • 谢谢。请注意,该名称不必再次传入,因为它已经使用名称进行了初始化。这里也不需要哈希括号。
    • 所以操作是分开的,不在一个事务中。
    • find_or_initialize_by_method 自 Rails 4 起已弃用
    【解决方案2】:

    上面的检查答案适用于 Rails 3。也就是说,find_or_initialize_by_attribute 方法在 Rails 4 中已被弃用。这是新方法。见Rails4 Deprecation warning for find_or_initialize_by method

    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
      

      【讨论】:

        猜你喜欢
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 2016-04-06
        • 2013-03-21
        • 1970-01-01
        相关资源
        最近更新 更多