Нужна помощь со связыванием с представлениями модели в Rails

#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. Моя первоначальная мысль заключалась в том, чтобы сделать вещи, которые часто меняются, связанными моделями. Поэтому очки жизни, класс брони и т.д. Были созданы как связанные модели, чтобы их было легко разделить и отредактировать. Я ввел имя, класс, расу, пол и т.д. В атрибуты, потому что эти вещи статичны и не изменятся. Однако я согласен, что добавляю сюда немного ненужной сложности.