Ruby on rails 存储可能相似的元素矩阵
我正在用Ruby On Rails制作一个小应用程序,让您可以像这样创建RPG游戏地图: 对于“我应该如何保存此数据?”的问题,我的第一个想法是创建一个模型Ruby on rails 存储可能相似的元素矩阵,ruby-on-rails,ruby,database,data-structures,Ruby On Rails,Ruby,Database,Data Structures,我正在用Ruby On Rails制作一个小应用程序,让您可以像这样创建RPG游戏地图: 对于“我应该如何保存此数据?”的问题,我的第一个想法是创建一个模型Tile和一个模型Map,该模型有许多:tiles。可能会为平铺提供一个x和y参数,以了解它们在地图中的位置 但是,再一次,我看了看地图,我看到有很多完全相同的瓷砖。例如,“草砖”,在地图的40%左右反复出现 所以我想知道。有没有更聪明的方法来保存这些信息以节省空间?我会使用TileType模型来存储tile的“原型”: tile_type
Tile
和一个模型Map
,该模型有许多:tiles
。可能会为平铺提供一个x和y参数,以了解它们在地图中的位置
但是,再一次,我看了看地图,我看到有很多完全相同的瓷砖。例如,“草砖”,在地图的40%左右反复出现
所以我想知道。有没有更聪明的方法来保存这些信息以节省空间?我会使用TileType
模型来存储tile的“原型”:
tile_types:
name (String)
id (Integer)
sprite (String)
travel_cost (Float)
# ...
这些可以由开发人员或受信任的用户创建。
然后使用联接表(tiles
)将实际的tile实例链接到映射
tiles:
map_id (Integer, foreign key)
tile_id (Integer, foreign key) # you may want an index on [map_id, tile_id]
x (Integer, index)
y (Integer, index) # you may want an index on [x, y]
然后,您将使用具有关系的联接表
class Map < ActiveRecord::Base
has_many :tiles
has_many :tile_types, through: :tiles
end
class Tile < ActiveRecord::Base
belongs_to :map
belongs_to :tile_type
# example of a geospatial query method
def self.at(x:, y:)
find_by(x: x, y: y)
end
end
class TileType < ActiveRecord::Base
has_many :map_tiles
has_many :maps, through: :tiles
end
否则,您必须找到属于每个地图的所有分幅并更新它们。愚蠢的问题。我知道删除评论!为什么要说明Map
和TileType
之间的关系?因为在某个时候,您可能会想知道映射中使用了哪些TileType
。例如,许多地图编辑器都有一个使用平铺的调色板。当你做map.tile\u类型时
rails会为你做连接查询。的确,谢谢你,伙计。这帮了大忙
TileType.find_by(name: 'Tall Grass').update(travel_cost: 1.8)