在链接到 Rails 中的模型视图时需要一些帮助
Posted
技术标签:
【中文标题】在链接到 Rails 中的模型视图时需要一些帮助【英文标题】:Need some help with linking to model views in Rails 【发布时间】:2011-05-18 22:08:11 【问题描述】:我正在开发龙与地下城角色数据库应用程序。我有一个 Character 模型和几个属于 Character 且具有 has_one 关联的模型,例如 HitPoints、ArmorClass 等。这些都是从字符视图中构建、编辑和显示的。但是,我想创建包含更多属于 Character 模型的信息的新页面。我希望在视图顶部有一个链接,将用户带到装备页面,该页面上显示单独的模型,例如武器、盔甲、装备等。
这是我需要一些指导的地方。装备页面是否会是一个属于角色的新模型,而我只是将武器、盔甲、装备等模型加载到装备视图中?
如果是,这些模型是否与角色模型、装备模型或两者都具有belongs_to关系?
最后,如果我这样构建它:Character has_one Equipment 和 Equipment has_many Weapons,Weapons 模型是否也与 Character 模型有belongs_to 关系?
在此先感谢,我希望我想要做的事情很清楚。我仍然无法谈论我想用 Rails 完成什么。
【问题讨论】:
【参考方案1】:听起来您对模型的一些概念有误解。例如,HitPoints
和 ArmorClass
不应是与您的 Character
具有 has_one
关联的模型。它们只是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”模型可以有一个“ItemType”字段,告诉你它是武器、盔甲、药水等等。
所以你的Item
模型可能看起来像这样
class Item
attr_accessor :name, :type
def initialize(name, type)
@name = name
@type = type
end
end
另一个更接近您所说的选项是添加ItemSet
模型。我们将这个模型放在Character
和Items
之间。这样做会让你说
has_one
“项目集”
“项目集”has_many
“项目”
Character”通过“ItemSet”有很多“Items”
所以基本上,这表明在你的“世界”中你有很多角色和物品。但是每个角色都有一组独特的这些物品。
我就是这样做的。
在上面的代码中,您需要将has_many
、has_one
等属性添加到模型中。我把它省略了,这样你就可以更容易地看到模型本身,这样你就可以自己弄清楚你想怎么做。
【讨论】:
我最初将 HitPoints 和 ArmorClass 作为模型,因为它们中的每一个都有几个组件或数据要显示(HitPoints 有总和当前的 HP,ArmorClass 有盔甲、盾牌、奖金等),我想让它们保持井井有条并在以后设计它们会更容易。这样做与将它们作为属性相比有什么真正的缺点吗?我喜欢您对 Item 和 ItemSet 模型的建议,这绝对让我深思。 我认为拥有 Character.total_hit_points 和 Character.current_hit_points 而不是关系会更简单。生命值似乎与角色过于相关,无法成为自己的模型。 ArmorClass 可能需要不同的模型,具体取决于它可能具有的属性。 好吧,我认为您可能在概念上建模错误。命中点可以是 total_hitpoints 和 current_hitpoints 属性。 ArmorClass 只是一个数字,不是吗?它是计算出来的,但它仍然只是一个数字。我不认为这两件事是模型。如果我们使用您当前的模型逻辑,那么“名称”也可能是一个对象。和一个“角色”有一个“名字”。对我来说没有意义,并且增加了一层复杂性而没有增加太多好处。 “字符”具有“名称”属性更有意义。 我最初的想法是把经常变化的东西做成关联模型。因此,生命值、护甲等级等被构建为关联模型,既可以使它们保持独立,又易于编辑。我将姓名、阶级、种族、性别等设置为属性,因为这些东西是静态的,不会改变。不过,我同意我在这里增加了一些不必要的复杂性。以上是关于在链接到 Rails 中的模型视图时需要一些帮助的主要内容,如果未能解决你的问题,请参考以下文章
如何让模型验证与 Rails 中的视图层对话以提供简单的功能?