Похоже, вы неправильно понимаете некоторые концепции моделей.Например, HitPoints
и ArmorClass
не должны быть моделями, которые имеют has_one
связь с вашим Character
.Они просто атрибуты Character
.Таким образом, ваша модель должна выглядеть примерно так:
class Character
attr_accessor :name, :hit_points, :armor_class
def initialize(name, hitpoints=10, armor_class=0)
@name = name
@hitpoints = hitpoints
@armor_class = armor_class
end
# some other stuff, etc
end
Тогда вы можете получить к ним доступ следующим образом:
fighter = Character.new("Conan", 100, 12)
puts "I am #{fighter.name} and I have #{fighter.hit_points} hitpoints."
puts fighter.armor_class # outputs 12
Кроме того, я бы сказал, Equipment
модель - неправильная концепция,Что вам нужно, это Item
модель.Все, что вы упомянули (оружие, доспехи, снаряжение) - это всего лишь предметы.И это имеет гораздо больше смысла, чем «Персонаж» has_many
«Предметы».Кроме того, этот «Предмет» has_many
«Символы», так как у вас предположительно будет несколько символов с несколькими предметами ... так что это МОЖЕТ быть отношением многих ко многим, чтобы сохранить его простым.Тогда ваша модель «Предмет» может иметь поле «Тип элемента», которое сообщает вам, является ли это оружие, броня, зелье и т. Д.
Так что ваша модель Item
может выглядеть так
class Item
attr_accessor :name, :type
def initialize(name, type)
@name = name
@type = type
end
end
Другой вариант, который ближе к тому, о чем вы говорите, - добавить модель ItemSet
.Мы поместили бы эту модель между Character
и Items
.Делая это таким образом, вы скажете, что
- "Персонаж"
has_one
"ItemSet" - "ItemSet"
has_many
"Items" - Character "имеетмножество «Предметов» - «Набор предметов»
По сути, это показывает, что в вашем «мире» у вас много персонажей и предметов, но у каждого персонажа есть уникальный набор этих предметов.
Я бы так и сделал.
В приведенном выше коде необходимо добавить атрибуты has_many
, has_one
и т. Д. К моделям. Я пропустил это, чтобы вы могли видетьСами модели немного проще, и вы можете сами понять, как вы хотите это сделать.