【问题标题】:undefined method 'keys' when using upsert使用 upsert 时未定义的方法“键”
【发布时间】:2021-12-13 21:11:01
【问题描述】:

我想使用 upsert_all 方法从集合中插入(和更新)记录 在一个简单的查询中,例如:

books = [] 

10.times do |i|
  books << Book.new(name: "book #{i}")
end

Book.upsert_all(books)

但是,我收到以下错误:

.../activemodel-6.1.4.1/lib/active_model/attribute_methods.rb:469:in `method_missing': undefined method `keys' for #<Book id: nil, name: "book 0"> (NoMethodError)

而我正在寻找的是能够将任意集合的 insert all 或 upsert_all 作为书籍,例如,如果你能帮助我,我将不胜感激

【问题讨论】:

    标签: ruby-on-rails ruby activerecord rubygems


    【解决方案1】:

    upsert_all 期望一个哈希数组,而不是 ActiveRecord 对象:

    books = [] 
    
    10.times do |i|
      books << { name: "book #{i}" }
    end
    
    Book.upsert_all(books)
    

    【讨论】:

    • 更优雅的写法是books = 10.times.map { |i| { name: "book #{i}" }}
    • 你说得对,而且更优雅,并遵循最佳实践在每个集合中分配。非常感谢@max :D
    • @max - 其实应该是Array.new(10) { |i| {name: "book #{i}"} } :)
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多