Я думаю, что вы определили здесь отношения таким образом, что это вызовет у вас проблемы. Возможно, вы обнаружите, что лучше использовать простую модель соединения пользователя с элементом, что-то вроде этого:
class User < ActiveRecord::Base
has_many :owned_items
has_many :game_items, :through => :owned_items
end
class OwnedItem < ActiveRecord::Base
belongs_to :user
belongs_to :game_item
# Has 'location' field: 'warehouse' or 'inventory'
end
class GameItem < ActiveRecord::Base
has_many :owned_items
has_many :users, :through => :owned_items
end
Это распространенная модель, когда у вас есть пользователи и некоторые вещи, экземпляром которых они будут владеть. Посредственная таблица отношений, OwnedItem, используется для определения, среди прочего, любых уникальных характеристик этого конкретного экземпляра GameItem, а также его местоположения относительно пользователя.
Как правило, такого рода структура избегает использования полиморфных ассоциаций, которые могут вызывать проблемы, если используются слишком случайно. По возможности старайтесь избегать полиморфных ассоциаций, если они не находятся на самом краю ваших отношений. Помещение их в середину значительно усложняет объединение и затрудняет настройку индексов.
Как примечание об оригинале, вы можете свернуть многое из этого в простую область, которая использует метод хеширования для where
:
scope :with_item_type, lambda { |types|
where('game_items.item_type' => types)
}
Это будет принимать либо массив, либо строковый аргумент и будет использовать IN
или =
соответственно. Это действительно очень удобно, потому что вам не нужно помнить, какой из них использовать.