我正在研究一个RPG字符表(首先是DnD,但将是通用的),而当我得到一些有关如何构建数据库的建议时,我已经进行了设置,并且我知道它是如何工作的。我无法找出设置角色编辑表单的最佳方法。
“我的数据库”的字符属性结构如下
class Character < ApplicationRecord
has_many :character_sheets, dependent: :destroy
has_many :character_attributes, through: :character_sheets
end
class CharacterAttribute < ApplicationRecord
has_many :character_sheets
has_many :characters, through: :character_sheets
end
class CharacterSheet < ApplicationRecord
belongs_to :character
belongs_to :character_attribute
end
数据库模式如下:
create_table "character_attributes", force: :cascade do |t|
t.string "name"
t.index ["game_type_id"], name: "index_character_attributes_on_game_type_id"
end
create_table "character_sheets", force: :cascade do |t|
t.integer "character_id"
t.integer "character_attribute_id"
t.integer "value_int"
t.text "value_char"
t.boolean "value_boolean"
t.index ["character_attribute_id"], name: "index_character_sheets_on_character_attribute_id"
t.index ["character_id"], name: "index_character_sheets_on_character_id"
end
create_table "characters", force: :cascade do |t|
t.string "name"
t.integer "user_id"
t.index ["user_id"], name: "index_characters_on_user_id"
end
这一切都可以工作并存储信息,但是它会显示很多额外的查询来显示每个属性(最多100个),并且每个属性最终对我显示的每个属性进行2个查询,这很快就会变得多余。仅供参考,这是我进行快速测试以显示信息的方式:
<% @level = @character.character_attributes.find_by(name: 'Level')%>
<%= @level.name %>
<%= @character.character_sheets.find_by(character_attribute_id: @level.id).value_int %>
是否有更好的方式显示信息或进行初始查询以获取所有内容,所以我只查询数据库一次?还计划使用best_in_place宝石来就地编辑所有字段