Нужна помощь в связывании с видами моделей в Rails - PullRequest
1 голос
/ 19 мая 2011

Я работаю над приложением базы данных персонажей Dungeons and Dragons.У меня есть модель персонажа и несколько моделей, которые принадлежат персонажу с ассоциацией has_one, такие как HitPoints, ArmorClass и так далее.Все они построены, отредактированы и отображены в виде символов.Однако я хочу создать новые страницы с дополнительной информацией, которая относится к модели персонажей.Мне нужна ссылка в верхней части представления, которая переводит пользователя на страницу «Оборудование», на которой отображаются отдельные модели, такие как Оружие, Броня, Снаряжение и т. Д.

Здесь мне нужно немногоруководство.Будет ли страница «Оборудование» новой моделью, принадлежащей персонажу, и я просто загружаю модели для оружия, доспехов, снаряжения и т. Д. В представление «Оборудование»?

Если это так, будут ли эти модели иметь отношение «принадлежат» к модели персонажа, модели экипировки или к обеим?

Наконец, если я построю это так:будет ли модель Оружия также принадлежать к модели персонажа?

Заранее спасибо, надеюсь, то, что я пытаюсь сделать, понятно.Мне все еще трудно говорить о том, чего я хочу достичь с помощью Rails.

1 Ответ

0 голосов
/ 19 мая 2011

Похоже, вы неправильно понимаете некоторые концепции моделей.Например, 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 и т. Д. К моделям. Я пропустил это, чтобы вы могли видетьСами модели немного проще, и вы можете сами понять, как вы хотите это сделать.

...