【问题标题】:can find_or_create_by_name update?可以 find_or_create_by_name 更新吗?
【发布时间】:2013-05-31 16:39:37
【问题描述】:

在rails中使用find_or_create_by_name时,如果找到了表并且你传入了其他属性的参数,它会更新表吗?例如:

College.find_or_create_by_name(name: 'University of Pittsburgh', calendar: 'semester')

假设已经创建了 University of Pittsburgh 表,但日历属性为 nil。此代码是否会更新日历属性以使其成为“学期”?

一些背景...我正在制作一个包含不同大学页面的网站。该网站的一部分涉及列出大学的一堆数据。现在我正在编写我的种子文件,但我预计必须更改它。我希望网站上有数百所学校,每所学校都有数百条不同的数据。我在想拥有种子文件并使用 find_or_create_by_name 会是一个很好的方法,但如果你有更好的方法,请告诉我。

【问题讨论】:

    标签: ruby-on-rails seeding


    【解决方案1】:

    如果记录已存在,该代码将不会更新该记录。我建议:

    @college = College.find_or_initialize_by_name("Robot House!!")
    @college.attributes = {
      reputation: "partyhouse",
      occupants: "robots"
    }
    @college.save!
    

    如果需要,您可以将其包装在一个方法中。

    【讨论】:

      【解决方案2】:

      find_or_create_by_ 完全按照它所说的去做:它要么创建一个新项目(创建保存到数据库),要么找到现有的项目,这意味着从数据库中读取它。
      在创建对象时返回 false 验证错误

      所以要保存更改,您可以使用正常的更新方法:

      if @college= College.find_or_create_by_name(given_attributes) &&
         @college.update_attributes(given_attributes)
      else
        # handle validation errors
      end
      

      它不会两次访问数据库,因为update_attributes 不会对新创建的对象应用任何更改(但可能对现有对象进行更改)

      写得更明确:

      @college= College.find_or_create_by_name(given_attributes)
      if @college.present?
         if @college.update_attributes(given_attributes)
           # do your success stuff
         else
           # handle update validation errors
         end
      else
        # handle find_or_create errors
      end
      

      【讨论】:

      • 所以由于 update_attributes 不会对新创建的对象应用更改,我必须运行 rake db:seed 两次以确保所有内容都更新正确?
      • 不,我的意思是:如果一个对象是新的,它由find_or_create_ 创建(写入数据库)。在那之后,update_attributes 不会改变任何东西,所有属性都是相同的,所以隐含的save 不会做任何事情。因此,find_or_create_ 写入了一个新对象,而update_attributes 更新了现有对象。无论哪种方式,对象都会被保存。
      • 对不起,我没有正确地回答这个问题。我的意思是问...如果我运行 rake 两次,它将确保所有学院都将更新,因为如果学院还不存在,它将由第一个 rake 创建,并由第二个 rake 更新,如果学院确实存在,它将由第一个 rake 更新,第二个 rake 不会做任何事情
      • 由于某种原因,当我运行 rake db:seed 时,它说 update_attributes 是一个未定义的方法。你知道为什么会这样或者我能做些什么吗?
      • 表示@college 无效,所以find_or_create 返回nil 在函数名末尾尝试! 以引发错误。
      猜你喜欢
      • 2017-03-15
      • 2018-01-20
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2011-03-12
      • 2012-05-31
      相关资源
      最近更新 更多