Я бы, наверное, сделал комбинацию обоих.У меня будет ассоциация для владельца для каждого элемента, а затем ассоциация для места или позиции элемента.Оба из них, вероятно, будут полиморфными.Я думаю, что это был бы лучший способ соответствовать некоторым вероятным сценариям, таким как:
- Элемент принадлежит игроку и помещается в инвентарь игрока
- Элемент принадлежитигроком и помещается на склад игрока
- Предмет является владельцем игрока и оборудован игроком (возможно, это все еще инвентарь)
- Предмет принадлежит гильдии (если это что-то, что вы можете захотеть в будущем), но в инвентаре игроков (заимствованных) или экипированных
Думая об этих сценариях, я думаю, что более эффективен запрос базы данных, чтобы можно было загружать все принадлежащие предметыигроком без прохождения инвентаря, складов и т. д. или чтобы иметь возможность получить все предметы, экипированные игроком, без прохождения через разных владельцев и т. д.
Редактировать
Вот пример:
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, то позиция - это полиморфная ассоциация, которая указывает, где находится элемент в данный момент (инвентарь, склад и т. д.), а затем он также принадлежит_пользователь, который указывает, кто является владельцем предмета.Теперь вы спросили, является ли он избыточным, и я предполагаю, что вы имеете в виду, что его можно найти, проверив инвентарь предмета и посмотрев, кому принадлежит этот инвентарь.Да, конечно, это возможно.Но тогда было бы невозможно иметь в инвентаре не принадлежащий вам предмет, то есть «предмет гильдии».
Но даже если вы решите не добавлять что-то вроде гильдий, я все равно рекомендуючтобы OwnedItem принадлежал пользователю.Пример для поддержки этого может быть, если вы планируете, чтобы некоторые элементы были «уникальными», поскольку у пользователя может быть только один элемент такого рода.Вместо того, чтобы проверять и инвентарь, и склад (и, возможно, что-то еще), вы можете просто указать:
validates_uniqueness_of :item_id, :scope => :user_id
в классе OwnedItem, и вы готовы идти.
Моя точка зрения такова, чтовсе ограничения, запросы и сравнения могут быть сделаны более экономно, если у вас есть и владелец, и позиция для элемента.