I want to add a column in a mysql table from a controller. The user completes a form, and when he sends it, it creates a new column (not row) with the information in the form. How can I do this?
答案 0 :(得分:2)
它创建新列
<强>唐&#39;吨强>
您的数据库是神圣不可侵犯的,动态地更改它就像根据某些用户的请求动态更改汽车一样。一辆汽车有四个轮子,发动机和座椅。你可以改变颜色,轮胎等......但不能改变基础。
与网络应用程序相同 - 您不应该更改系统的基本结构。当然,您可以更改它的各个方面(用户头像等),但系统的基础(db
架构)应该保持在任何更改之上。
您应该做的是通过一套紧密的Models
维护您的数据库保真度,让您围绕数据创建动态体验 39;已经提供。
例如......
用户填写表单并在发送时创建新列
更好解释此问题的方法是使用user story
。
我会在你的案例中推测以下内容:
用户想要将新项目添加到他的投资组合中。他填写表格来解释项目的内容,并添加一些特定于该项目的额外字段。
我认为你在询问&#34;额外字段&#34;部分...
你必须记住Rails建立在关系数据库之上:
这意味着您具有模型提供的灵活性,可以授予您的用户添加和操作的能力。他们需要的数据。
他们添加到系统的数据可以包含任何名称&amp; 任何结构,只要您在系统内提供该功能......
#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 %>
答案 1 :(得分:0)
您为什么要通过控制器向数据库添加新列?事实并非如此 - 总的来说,我无法做到这一点。想一想为什么要这样做的一个原因。这听起来非常规,违背了设计原则。
如果您添加了有关所需内容以及您要执行的操作的更多信息,我非常确定我们可以制定替代解决方案。 (我打赌你要做的事情可以用多对多的关系来实现,或者类似的,以某种方式)。发布更多信息,看看我们能做些什么。
但作为答案和解决方案,我说它不应该被要求。
答案 2 :(得分:0)
你为什么要这样做?数据库设计是应用程序开发的一部分,因此你是决定行的人。当用户输入数据时,可能会出现大量错误(黑客,无效值......),这可能会影响整个数据库。这不值得担心。
如果需要灵活的架构,可以在特定字段中存储哈希值。
例如,您有一个extra_data
字段,它是一个哈希值。然后在您的表单中,您可以输入input_name
和input_value
,这些输入将转到哈希值。这样,您将为同一列提供更灵活的值,而无需更改数据库架构。