gpt4 book ai didi

ruby-on-rails - 在 Mongoid 中,我如何创建一个数组或引用数量

转载 作者:可可西里 更新时间:2023-11-01 09:46:09 24 4
gpt4 key购买 nike

我有一个

class Item
include Mongoid::Document
field name, type: String
end

和一个

class Pack
include Mongoid::Document
end

每个包可以包含不同数量的不同元素。

我本来想做的

class Pack
include Mongoid::Document

field items, type: Array
end

一开始,我试过

a = Pack.new
a.items = []
a.items << {item: Item.first, quantity: 4}
a.save

我得到了:

NoMethodError: undefined method `__bson_dump__' for #<Item:0x007faf1a56d670>

然后我尝试了:

a = Pack.new
a.items = []
a.items << {item_id: Item.first.id, quantity: 4}
a.save

但是现在我不能做类似的事情

a.items[0].item.name

接下来,我尝试了

class Item
include Mongoid::Document
field name, type: String
belongs_to :item_quantity
end

class ItemQuantity
include Mongoid::Document
has_one :item
belongs_to :pack
field quantity, type: Integer
end

class Pack
include Mongoid::Document
has_many :item_quantity
end

这行得通,但感觉有点乱

我如何最好地做到这一点?

最佳答案

您的最后一次迭代与我过去解决类似问题的方式很接近。我会尝试根据您的情况进行调整。我所做的主要不同之处在于没有将数量存储在“加入”集合中,因此对于包中某个项目的多个“副本”中的每一个,都会在该集合中创建一个新文档。

class Item
include Mongoid::Document
has_many :item_instances
end

class ItemInstance
include Mongoid::Document
belongs_to :item
belongs_to :pack
end

class Pack
include Mongoid::Document
has_many :item_instances
end

有了它,你可以做类似的事情:

pack = Pack.new
item = Item.first
pack.item_instances.build(item_id: item.id)

我将其用于打印店管理应用程序,其中的类是 Invoice、Job、Product。一个工作是一种产品的“实例”,一张发票有很多工作,它们可能都是同一个产品,所以直接的多对多映射是行不通的。

我还会重新考虑您的架构并确保事物的命名有意义。只需将您的类分别从 Item、ItemInstance、Pack 重命名为 Product、Item、Pack,事情就更清楚了:

pack = Pack.new
product = Product.first
pack.items.build(product_id: product.id)

最后,如果您在 Pack 类中创建一些简单的便捷方法,那么可以大大有助于创建更有用的界面:

class Pack
def new_item(product)
self.items.build(product_id: product.id)
end

def products
self.items.map { |i| i.product }
end
end

所以你可以这样做:

pack.add_item(product)
# Same as using pack.items.build(product_id: product.id)

pack.products
# Returns an array (including duplicates) of all the products included in the pack.

希望对您有所帮助。这种情况不常出现,而且我确信还有其他解决方案,但这是我在尝试解决“一个对象有多个另一个对象”问题时使用的基本模式。

添加您自己的与您将如何使用该类相关的方法,它应该非常有用。另外,不要忘记在“join”集合上设置索引。并查看 this issue在 Mongoid 的 Github 页面上,请求用于多对多关系的数组中的多个条目。

如果添加了它,如果您只需要一个简单的关系,它将成为 future 的发展方向。如果您要存储更多详细信息,就像我在创建产品打印作业时所做的那样(时间戳、标题等),您仍然需要执行与上述类似的操作。

关于ruby-on-rails - 在 Mongoid 中,我如何创建一个数组或引用数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12547972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com