在Rails项目中,我需要用户拥有库存和仓库。物品可以兑换。问题是,处理这个问题的最有效方法是什么?我想到了:
User has one inventory -> inventory has many items through inventory_item
User has one warehouse -> warehouse has many items through warehouse_item
但是,我不确定这是否是最有效的方法。另一个想法是拥有一个user_item,其中包含一个类似于位置的字段,可以是库存或仓库。
您认为最佳做法是什么?
答案 0 :(得分:2)
我可能会将两者结合起来。我会为每个项目的所有者建立一个关联,然后关联该项目的位置或位置。这些都可能是多态的。我认为这是适合某些可能情况的最佳方式,如:
考虑到这些场景我认为更多的数据库查询是有效的,能够加载玩家拥有的所有项目而无需通过库存,仓库等循环,或者能够获得玩家配备的所有项目而无需通过不同的所有者循环等
修改
以下是一个例子:
class User < ActiveRecord::Base
has_one :inventory
has_one :warehouse
has_many :owned_items #:as => :owner ???
has_many :items, :through => :owned_items
end
class OwnedItem < ActiveRecord::Base
belongs_to :user #:polymorhpic => :true ???
belongs_to :position, :polymorphic => true # Could be inventory, warehouse or someplace else
belongs_to :item
end
class Inventory < ActiveRecord::Base
belongs_to :user
has_many :owned_items, :as => :position
end
class Inventroy < ActiveRecord::Base
belongs_to :user
has_many :owned_items, :as => :position
end
在上面的例子中,我遗漏了一个公会或类似东西作为一个项目的拥有者的可能性,但我添加了评论,可以很容易地适应它以支持这样的事情。
因此,如果您查看OwnedItem类,position是指定项目当前所在位置的多态关联(库存,仓库等),然后它也属于一个用户,该用户指定了所有者项目是。现在你问它是多余的,我认为你的意思是通过检查项目的库存并查看该库存属于哪个来找到它。是的,当然这是可能的。但是,不可能在库存中有一个不属于你的物品,即“公会物品”。
但即使你选择不添加公会这样的东西,我仍然建议让OwnedItem属于一个用户。支持这种情况的一个例子是,如果您计划某些项目是“唯一的”,因为在用户中只能有一个这样的项目。您可以只指定:
,而不是同时检查invetory和仓库(以及可能的其他内容)validates_uniqueness_of :item_id, :scope => :user_id
在OwnedItem类中,你很高兴。
我的观点是,如果你同时拥有一个项目的所有者和一个位置,那么所有的限制,查询和比较都可以节省更多的时间。