【问题标题】:Update all data of model in rails更新rails中模型的所有数据
【发布时间】:2023-03-19 22:31:01
【问题描述】:

例如我们有:

class PublicLibrary  < ActiveRecord::Base
  has_many :books
end


class Book  < ActiveRecord::Base
  belongs_to :public_library
end

如果我们想更新 PublicLibrary 中的所有书籍,我们可以添加到 PublicLibrary 模型中

accepts_nested_attributes_for :books, :allow_destroy => true, :reject_if=>:all_blank

现在我们可以做这样的事情了

library=PublicLibrary.find(ID)
library.update_attributes(:books_attributes=>{<bunch of books here>})

所有相关书籍都会更新,部分书籍将被删除,一些新书籍将插入表格书籍中

现在我有一些模型书,与 PublicLibrary 没有关系:

class Book  < ActiveRecord::Base
end

我有一个管理面板,可以在一张大桌子上显示所有书籍,并且想一键更新/删除/插入新书籍,所以我想要类似的东西

Book.bulk_update({...books...}) 

或者使用子集(不确定我是否真的需要它,但如果我们能做到……为什么不知道怎么做?)

books_to_update=Book.where(...).bulk_update({...books...})

当然 Book 可能有一些嵌套模型。

你有什么想法吗? 附:目前我只知道有一些父母并为它做更新......

【问题讨论】:

  • 不幸的是,ActiveRecord 不能做所有事情,虽然我可能是错的,但我不认为你要求的是可能的。我对 AR 让多态 + STI 工作变得困难有自己的抱怨,所以我知道你的感受!但是,编写一些遍历哈希并酌情创建/更新/销毁的代码应该不会太难。你可以把它变成一个可以扩展 ActiveRecord 功能的 gem。

标签: ruby-on-rails activerecord nested-attributes


【解决方案1】:

您的 {...books...} 哈希中包含您想要的多本书

books.each { |id, book| Book.find(id).update_attributes(book) }

或者您想要进行真正的批量更新(意味着对所有正在运行的书籍进行相同的更新) 那么你可以使用http://apidock.com/rails/ActiveRecord/Relation/update_all

【讨论】:

  • 是的,我知道。您的解决方案不能满足我的需要。我需要在 one 查询中更新+删除+插入不同的数据到 activeRecord (我特别展示了使用嵌套属性的示例)。当然我可以自己做,但是如果 Rails 可以为嵌套属性做,也许它可以为没有父级的一堆数据做这个工作?
猜你喜欢
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多