2016-11-07 96 views
0

我正在使用模型来跟踪我的超市购买。表示项的表的模式是:Rails:我可以将一个列作为一个表自己脱掉吗?

CREATE TABLE "items" 
("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "barcode" varchar, 
    "brand" varchar, 
    "gendesc" varchar, 
    "size" float, 
    "unit_id" integer, 
    "created_at" datetime NOT NULL, 
    "updated_at" datetime NOT NULL); 

gendesc包合物(通用描述,作为一个varchar)是一个建模错误;我应该把它作为一个外键,将文本描述放在一个附加表格中,因为同一事物的不同品牌对于一些但不是全部分析目的是等同的。所以,我想用一个gendescs_id列,它是由此产生了一些gedescs表,该表将相当于东西外键更换gendesc柱:

create table gendescs (id integer primary key, gendesc varchar); 

select into gendescs(gendesc) distinct gendesc from items; 

有它确实是这样的Rails迁移的顺序?

回答

1

理想的流量应该是这样的:

  1. 创建gendescs表。我不希望列名与表名相同。

    轨G型Gendesc值:字符串

  2. 添加外键

    轨摹迁移AddGendescToItem gendesc:引用

  3. 运行rake db:migrate

  4. 如果你有数据在items.gendesc列中,那么你需要cr在gendescs表中为他们提供条目。在rails控制台中运行以下代码。从项目表

    Item.find_each do |i| 
        g = Gendesc.find_or_create_by(value: i.gendesc) 
        i.update(gendesc_id: g.id) 
    end 
    
  5. 删除列gendesc How to remove a column from my Rails model?

  6. belongs_to的关系添加到项目模型

    belongs_to的:gendesc

相关问题