Как бы вы расположили свои модели? - PullRequest
0 голосов
/ 18 апреля 2011

В проекте 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 с полем, подобным местоположению, которое может быть инвентарным или складским.

Какая, на ваш взгляд, лучшая практика?

1 Ответ

2 голосов
/ 18 апреля 2011

Я бы, наверное, сделал комбинацию обоих.У меня будет ассоциация для владельца для каждого элемента, а затем ассоциация для места или позиции элемента.Оба из них, вероятно, будут полиморфными.Я думаю, что это был бы лучший способ соответствовать некоторым вероятным сценариям, таким как:

  1. Элемент принадлежит игроку и помещается в инвентарь игрока
  2. Элемент принадлежитигроком и помещается на склад игрока
  3. Предмет является владельцем игрока и оборудован игроком (возможно, это все еще инвентарь)
  4. Предмет принадлежит гильдии (если это что-то, что вы можете захотеть в будущем), но в инвентаре игроков (заимствованных) или экипированных

Думая об этих сценариях, я думаю, что более эффективен запрос базы данных, чтобы можно было загружать все принадлежащие предметыигроком без прохождения инвентаря, складов и т. д. или чтобы иметь возможность получить все предметы, экипированные игроком, без прохождения через разных владельцев и т. д.

Редактировать

Вот пример:

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, и вы готовы идти.

Моя точка зрения такова, чтовсе ограничения, запросы и сравнения могут быть сделаны более экономно, если у вас есть и владелец, и позиция для элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...