2

モデルのフィールドを追加/削除できる Rails コードを作成しています。

以下のようにフィールドのリストを追加できるモデル インベントリがあります。

def update_new_fields
  @fieldnames = params["fieldnames"]

  @fieldnames.each do |fieldname|
    ActiveRecord::Migration.add_column(Inventory, fieldname, :string)
  end    
end

更新されたフィールドのリストを表示するには

def index
  reload!
  @fields=Inventory.attribute_names
  respond_to do |format|
    format.html 
  end
end

ただし、次のエラーがあります。

undefined method `reload!' for #<InventoriesController:0x007fccf70b7720>

リロードしたら!コンソールで:

2.0.0 :163 >   ActiveRecord::Migration.remove_column(Inventory, "f", :string)
-- remove_column(Inventory(id: integer, name: string, description: string, quatity: integer, created_at: datetime, updated_at: datetime, a: string, b: string, c: string, e: string, f: string), "f", :string)
   (122.9ms)  ALTER TABLE `inventories` DROP `f`
   -> 0.1232s
 => nil
2.0.0 :164 > Inventory.reset_column_information
 => nil
2.0.0 :165 > Inventory.attribute_names
 => ["id", "name", "description", "quatity", "created_at", "updated_at", "a", "b", "c", "e", "f"]
2.0.0 :166 > reload!
Reloading...
 => true
2.0.0 :167 > Inventory.attribute_names
 => ["id", "name", "description", "quatity", "created_at", "updated_at", "a", "b", "c", "e"]

できます。

UPD

私が見つけたのは、「Inventory.reset_column_information」を作成した後、attribute_namesは更新されませんでしたが、クラス情報は次のとおりです。

2.0.0 :090 > Inventory.reset_column_information
 => nil
2.0.0 :091 > Inventory.attribute_names
 => ["id", "name", "description", "quatity", "created_at", "updated_at", "hello", "next"]
2.0.0 :092 > Inventory
 => Inventory(id: integer, name: string, description: string, quatity: integer, created_at: datetime, updated_at: datetime, a: string, b: string, c: string, d: string)

だから、私がした回避策は次のとおりです。

def index
  Inventory.reset_column_information
  tmp = Inventory.new
  @fields=tmp.attribute_names
  respond_to do |format|
    format.html 
  end
end

最後に、Inventory のフィールドが更新されます。

4

1 に答える 1