Ruby on rails 存储可能相似的元素矩阵

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

我正在用Ruby On Rails制作一个小应用程序,让您可以像这样创建RPG游戏地图:

对于“我应该如何保存此数据?”的问题,我的第一个想法是创建一个模型
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)