2015-10-06 55 views
1

我想從控制器的mysql表中添加一列。用戶完成一個表單,當他發送一個表單時,它會創建一個新的列(不是行),並在表單中包含信息。我怎樣才能做到這一點?從控制器的數據庫中添加列

+2

不好的壞請求 –

+0

您是否已將您的列作爲強參數添加到您的控制器中? – akbarbin

+0

@RichPeck爲什麼? @ MuhamadAkbarBinWidayat No. – Sleed

回答

2

它創建新列

不要

您的數據庫是神聖的,動態改變它就像是根據某些用戶的請求動態改變汽車。一輛車有四個輪子,發動機和座椅。你可以改變的顏色,輪胎等,但不是基本面。

這與網絡應用程序是一樣的 - 你不應該改變你的系統的基本結構。當然,你可以改變它的各個方面(用戶頭像等),但系統的底層基礎(db模式)應該保持在任何改變之上。


什麼你應該做的是通過一套嚴密的Models維護數據庫的保真度,從而允許您創建一個動態體驗各地你已經提供的數據。

例如...

用戶填寫一份表格,當他送它,它創建新列

一個更好的方式來解釋,這將是使用user story

我會猜測你的情況如下:

用戶希望將新項目添加到他的投資組合。他填寫表格來解釋項目的內容,併爲該項目增加了一些額外的字段。

我想你問的是「額外域」的一部分......

你要記住的Rails是建立在一個關係數據庫的頂部:

enter image description here

這意味着您可以通過您的型號提供的靈活性來授予您的用戶處理儘可能多的關聯數據。

它們添加到系統中的數據可以有任何名& 任何結構,只要您提供系統本身內的功能...

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :projects 
    has_many :specialized_fields, through: :projects 
end 

#app/models/project.rb 
class Project < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :specialized_field 
    accepts_nested_attributes_for :specialized_field 
end 

#app/models/specialized_field.rb 
class SpecializedField < ActiveRecord::Base 
    has_many :projects 
    has_many :users, through: :projects 
end 

根據我上面的例子中,

  • User可以使Project
  • Project可以有specialized fields(高於標準字段)
  • User可以添加專業領域的模型

因此,你可以做到以下幾點:

#app/controllers/projects_controller.rb 
class ProjectsController < ApplicationController 
    def new 
     @project = current_user.projects.new #-> assuming you're using Devise 
     @specialized_field = @project.build_specialized_field 
    end 

    def create 
     @project = Project.save project_params 
     @project.save 
    end 

    private 

    def project_params 
     params.require(:project).permit(:name, :start_time, :end_time, specialized_field_attributes: [:name, :value]) 
    end 
end 

的形式可能如下:

#app/views/projects/new.html.erb 
<%= form_for @project do |f| %> 
    <%= f.text_field :name %> 
    <%= f.fields_for :specialized_field do |s| %> 
     <%= s.text_field :name %> 
     <%= s.text_field :value %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 
0

爲什麼要通過控制器向數據庫添加新列?這不應該是這樣的 - 一般來說,我不能想到爲什麼要這樣做的唯一原因。這聽起來非常規並且違背了設計原則。

如果您添加更多關於需要什麼以及您打算做什麼的信息,我非常確定我們可以制定出替代解決方案。 (我敢打賭,你試圖做的事情可以通過多對多的關係或類似的方式來實現)。發佈更多信息,看看我們能做些什麼。

但作爲答案和解決方案,我會說它不應該是必需的。

0

你爲什麼要這樣做?數據庫設計是應用程序開發的一部分,因此您需要是決定行的一個因素。當用戶輸入數據時,會有一大堆可能出錯的事情(黑客,無效值......),這可能會影響整個數據庫。這不值得冒這個風險。

如果您想要靈活的模式,可以將散列存儲在特定的字段中。 例如,您有一個extra_data字段,它是一個散列。然後在你的表單中,你可以輸入,input_nameinput_value這將去散列。通過這種方式,您可以爲同一列獲得更靈活的值,而且不需要更改數據庫模式。