在 ruby 中制作一个活动对象的副本/克隆,并对其进行更改,而不会弄乱数据库

Make a copy / clone of an active object in ruby, and make changes to it, without messing with the database

我是 ruby 的新手。我用多种语言编写过代码,如果有很好的参考资料并且事情得到了逻辑上的解释,通常很快就能搞定。我快疯了。我已经在 Whosebug 以及其他网站上查看了与此相关的所有可能问题。每个人都说使用 .clone 或 .dub 或 freeze 甚至 Marshal.load(Marshal.dump(arr)) 之类的东西,但 none 这些工作。

我只想要原始对象的副本,我可以在运行时对其进行修改,而无需对数据库进行任何更改。

rails 项目将一堆产品加载到一个对象中,然后将其注入到下拉列表中。假设它叫做@products。客户希望我从下拉列表中删除某些条目,但不能将它们从数据库中删除。

例如,在 php 中,您只需将 db 对象加载到一个变量中,然后通过 id 删除您不想要的内容,然后遍历生成的对象/数组并创建落下。这不会改变数据库。

我很快意识到,Ruby 不是那样工作的,它会直接从数据库中删除内容,即使我使用 .clone 或 .dup。

假设我使用 tempproducts = @products,我做了类似 tempproducts.delete(11) 的操作,我不希望系统也去删除 @products(11)。

这是编程的基本功能,为什么我想不出做这么简单的事情?

非常感谢任何能帮助我解决这个问题的人,甚至 post 一个 link 的正确答案!

Checkout Array#select 过滤记录集合的方法

例如,假设您的 Product 模型有一列 shipping_category,并且您只想显示具有 localzonal 运输类别的产品,那么它将看起来像

@product.select { |p| p.shipping_category == 'local' || shipping_category == 'zonal' }

理想情况下,您应该使用 https://guides.rubyonrails.org/active_record_querying.html 根据数据库级别的某些条件过滤数据,使用 Active Record 的 where 方法。