Add column in database from controller

时间:2015-10-06 09:05:56

标签: mysql ruby-on-rails ruby

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?

3 个答案:

答案 0 :(得分:2)

  

它创建新列

<强>唐&#39;吨

您的数据库是神圣不可侵犯的,动态地更改它就像根据某些用户的请求动态更改汽车一样。一辆汽车有四个轮子,发动机和座椅。你可以改变颜色,轮胎等......但不能改变基础。

与网络应用程序相同 - 您不应该更改系统的基本结构。当然,您可以更改它的各个方面(用户头像等),但系统的基础(db架构)应该保持在任何更改之上。

应该做的是通过一套紧密的Models维护您的数据库保真度,让您围绕数据创建动态体验 39;已经提供。

例如......

  

用户填写表单并在发送时创建新列

更好解释此问题的方法是使用user story

我会在你的案例中推测以下内容:

  

用户想要将新项目添加到他的投资组合中。他填写表格来解释项目的内容,并添加一些特定于该项目的额外字段。

我认为你在询问&#34;额外字段&#34;部分...

你必须记住Rails建立在关系数据库之上:

enter image description here

这意味着您具有模型提供的灵活性,可以授予您的用户添加操作的能力。他们需要的数据。

他们添加到系统的数据可以包含任何名称&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_nameinput_value,这些输入将转到哈希值。这样,您将为同一列提供更灵活的值,而无需更改数据库架构。