#ruby-on-rails #views #models
#ruby-on-rails #Вид #Модели
Вопрос:
Я работаю над приложением базы данных персонажей Dungeons and Dragons. У меня есть модель персонажа и несколько моделей, которые принадлежат персонажу с ассоциацией has_one, такие как ХитПоинты, класс брони и так далее. Все они создаются, редактируются и отображаются в виде символов. Тем не менее, я хочу создать новые страницы с дополнительной информацией, относящейся к символьной модели. Мне нужна ссылка в верхней части представления, которая переводит пользователя на страницу оборудования, где на этой странице отображаются отдельные модели, такие как оружие, броня, снаряжение и так далее.
Здесь мне нужно некоторое руководство. Будет ли страница оборудования новой моделью, которая принадлежит персонажу, и я просто загружу модели для оружия, брони, снаряжения и так далее в представление оборудования?
Если да, будут ли эти модели иметь отношение belongs_to к модели персонажа, модели оборудования или к обоим?
Наконец, если я построю это таким образом: у персонажа есть одно снаряжение, а у оборудования — множество видов оружия, будет ли модель оружия также иметь отношение belongs_to к модели персонажа?
Заранее спасибо, я надеюсь, что то, что я пытаюсь сделать, понятно. Мне все еще трудно говорить о том, чего я хочу достичь с помощью Rails.
Ответ №1:
Похоже, вы неправильно понимаете некоторые концепции, связанные с моделями. Например, 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
«Символы», поскольку у вас предположительно будет несколько символов с несколькими items…so это МОЖЕТ быть отношение «многие ко многим», чтобы упростить его. Тогда ваша модель «Item» может содержать поле «ItemType», в котором указывается, является ли это оружием, броней, зельем и т.д.
Итак, ваша Item
модель может выглядеть следующим образом
class Item
attr_accessor :name, :type
def initialize(name, type)
@name = name
@type = type
end
end
Другой вариант, который ближе к тому, о чем вы говорите, — это добавить ItemSet
модель. Мы бы поместили эту модель между Character
и Items
. Выполнение этого таким образом позволило бы вам сказать
- «Символ»
has_one
«Набор элементов» - «ItemSet»
has_many
«Элементы» - Символ «имеет много «элементов» через «ItemSet»
Итак, по сути, это показывает, что в вашем «мире» у вас есть много персонажей и предметов. Но у каждого символа есть уникальный набор этих элементов.
Я бы сделал это именно так.
В приведенном выше коде вам нужно добавить атрибуты has_many
, has_one
и т.д. к моделям. Я опустил это, чтобы вам было немного проще видеть сами модели и чтобы вы могли понять, как вы хотите это сделать самостоятельно.
Комментарии:
1. Изначально я создал ХитПоинты и класс брони как модели, потому что у каждой из них было несколько компонентов или данных для отображения (у хитпоинтов общий и текущий HP, у ArmorClass есть броня, щит, бонусы и т.д.), И я подумал, что будет проще упорядочить их и оформить позже. Есть ли какой-либо реальный недостаток в том, чтобы делать это таким образом по сравнению с созданием их в качестве атрибутов? Мне нравится ваше предложение по моделям Item и ItemSet, это определенно дает мне пищу для размышлений.
2. Я думаю, что все равно было бы проще иметь Character.total_hit_points и Character.current_hit_points, а не отношения. Точки попадания кажутся слишком связанными с character, чтобы быть его собственной моделью. ArmorClass может потребоваться другая модель в зависимости от того, какими свойствами она может обладать.
3. Ну, я думаю, что вы, возможно, неправильно моделируете это концептуально. Точками попадания могут быть атрибуты total_hitpoints и current_hitpoints. А ArmorClass — это просто число, не так ли? Это вычисляется, но это все еще просто число. Я не рассматриваю эти две вещи как модели. Если мы используем вашу текущую логику модели, то «Name» также может быть объектом. И «Символ» имеет одно «Имя». Для меня это не имеет смысла и добавляет уровень сложности без особой пользы. Гораздо больше смысла имеет атрибут «Character», имеющий атрибут «name».
4. Моя первоначальная мысль заключалась в том, чтобы сделать вещи, которые часто меняются, связанными моделями. Поэтому очки жизни, класс брони и т.д. Были созданы как связанные модели, чтобы их было легко разделить и отредактировать. Я ввел имя, класс, расу, пол и т.д. В атрибуты, потому что эти вещи статичны и не изменятся. Однако я согласен, что добавляю сюда немного ненужной сложности.