Ruby中的动态变量名(在Rails上)

时间:2015-12-18 17:42:06

标签: mysql ruby-on-rails ruby variables

我需要使用MySQL框架将角色统计信息存储到Ruby on the Rails数据库。似乎我不能在我的数据库中使用数组而不转换到PostgreSQL,这是我目前无法做到的。所以,我认为动态变量名称是关键,但我不确定如何创建它们。目前我的代码看起来像这样:

class CreateInventories < ActiveRecord::Migration
  def change
    create_table :inventories do |t|
      t.string :user_name
      t.string :char_name
      t.string :char_item1
      t.string :char_item2
      t.string :char_item3
      t.string :char_item4
      t.string :char_item5
      t.string :char_item6
      t.string :char_item7
      t.string :char_item8
      t.string :char_item9
      t.string :char_item10
      t.string :char_item11
      t.string :char_item12
      t.string :char_item13
      t.string :char_item14
      t.string :char_item15
      t.string :char_item16
      t.string :char_item17
      t.string :char_item18
      t.string :char_item19
      t.string :char_item20


      t.timestamps null: false
    end
  end
end

显然这太可怕了。任何人都可以告诉我一种排序方式,以便它不会使用20行代码来创建真正应该只是一个变量吗?

2 个答案:

答案 0 :(得分:3)

这是未经测试的,但却是动态生成字符串或符号的基础:

create_table :inventories do |t|
  t.string :user_name
  t.string :char_name

  20.times do |i|
    t.string "char_item#{ 1 + i }".to_sym
  end

  t.timestamps null: false
end

答案 1 :(得分:1)

我建议您规范化数据模型。虽然您的结构适用于清单中的前20个项目,但如果要添加另一个清单槽,则不希望进行数据库迁移。

如果将项目数据存储在单独的表中,则可以使用InventoryItems表作为连接表。

class CreateInventories < ActiveRecord::Migration
  def change
    create_table :inventory_items do |t|
      t.references :user
      t.string :inventory_slot
      t.references :item
    end
  end
end

这样,您可以使角色的库存任意大,而无需进行任何数据库迁移。