2014-02-21 3 views
0

Я очень новичок в RoR и пытаюсь написать миграцию, которая добавляет 200 похожих столбцов в мою базу данных. Для каждого счета в таблице я хотел бы собирать позиции в отдельных столбцах. Каждый счет-фактура может содержать до 200 наименований.Как использовать цикл for внутри миграции Rails?

Вот код, который я написал (не перебрать, как я хотел бы его):

def change 
    create_table :invoices do |t| 
    200.times do |i| 
     t.string :itemdescription_i 
     t.decimal :itemqty_i 
     t.decimal :itemunitprice_i 
     t.decimal :itemextendedprice_i 
    end 
    end 
end 

Как я мог бы создать столбцы, используя цикл?

ответ

2

Лучше создать таблицу ссылок, называемую invoice_item, в таблицу счетов. Любые связанные элементы счета будут добавлены в эту таблицу, ссылаясь на счет-фактуру. Затем в вашем коде вы можете просто получить счет-фактуру и позвонить invoice.invoice_items

create_table :invoice_items do |t| 
    t.references :invoice 
    t.string :itemdescription 
    t.decimal :itemqty 
    t.decimal :itemunitprice 
    t.decimal :itemextendedprice 
    end 
+1

Действительно хороший момент, спасибо за то, что нашли время, чтобы показать мне, как правильно структурировать мою базу данных. – user3335830

1
200.times do |i| 
    t.string :"itemdescription_#{i}" 
    t.decimal :"itemqty_#{i}" 
    t.decimal :"itemunitprice_#{i}" 
    t.decimal :"itemextendedprice_#{i}" 
    end 

Но обратите внимание, что это попало дизайн базы данных.

+0

Я уверен, что 't.column' возьмет строку. И не могли бы вы согласиться с тем, что ':" string "выглядит ужасно уродливо? :) –

+0

@SergioTulentsev Да, я знал это, просто покажите, как создать динамический символ для op, конечно же, строка работает тоже. – xdazz

Смежные вопросы