活动记录 插入遍历时出现一对多更新错误



给定两个具有一对多关联的 ActiveRecord 模型,User.rb:

class User < ActiveRecord::Base
    has_many :books, foreign_key: "user_id", dependent: :destroy
end

书.rb:

class Book < ActiveRecord::Base
    belongs_to :user, foreign_key: "user_id", dependent: :destroy
end

然后在 app.rb 中,问题会出现

class ProblemApp
    dbconfig = YAML.load(File.open("config/database.yml").read)
    ActiveRecord::Base.establish_connection(dbconfig['development'])
    user = User.first
    (1..5).each do |price|
        user.books.each do |book|   ####### bug line !!!!!!!!!!!!!!!
        end                     ####### bug line !!!!!!!!!!!!!!!
        return nil unless (book = user.books.find_by_id 1)
        puts book.name.to_s + " + " + price.to_s
        book.price = price  # change attr
        puts book.save      # save changing
        book = user.books.first
        puts book.name.to_s + " - " + book.price.to_s
        puts "================="
    end
end

控制台输出:

Running... 
Ruby + 1
true
Ruby - 1
=================
Ruby + 2
true
Ruby - 1
=================
Ruby + 3
true
Ruby - 1
=================
Ruby + 4
true
Ruby - 1
=================
Ruby + 5
true
Ruby - 1
=================

在每次更改操作之前插入 books.each 块时,模型的价格不会更新。但是,执行保存行时,数据库中的价格可能会更新。删除块的两行时,问题消失了。

更多信息在我的GitHub有人知道为什么以及如何解决这个问题吗?

也许你应该在阅读书籍之前更新用户的ActiveRecord::Relations。

尝试在book.save后添加user.reload

单击此处获取更多信息。

最新更新