用于将数据从一个表存储到另一个表的按钮

时间:2018-07-12 15:19:33

标签: ruby-on-rails ruby drop-down-menu ruby-on-rails-5

我有一个资金表,其中有一个字段name_of_organisation,它显示组织表中的组织列表。在列表中,我有一个选项“未列出”。如果未列出,则将打开另一个表单以添加组织。但是该组织的详细信息会添加到资金表中。我想要的是在资金显示页面上,如果添加了新的组织详细信息,则管理员可以验证组织详细信息,并应单击一个按钮,以便将资金表中的所有这些组织详细信息添加到组织表中。我需要有关show.html.erb页面上的“添加组织”按钮查询的帮助,以便将资金的组织详细信息添加到组织表中。

筹资方式表

create_table "fundings", force: :cascade do |t|
    t.string "type_of_activity"
    t.string "season"
    t.text "activity_details"
    t.string "name_of_organisation"
    t.string "city"
    t.string "province"
    t.string "postal_code"
    t.string "telephone_number"
    t.text "address"
    t.integer "organisation_id"
    end

组织结构图

create_table "organisations", force: :cascade do |t|
t.string "name_of_organisation"
t.text "address"
t.string "city"
t.string "province"
t.string "postal_code"
t.string "telephone_number"
end

Show.html.erb(资金)

<%unless @funding.organisation.blank?%>
    <p><strong>Name of the Organisation:</strong>
    <%= @funding&.organisation&.name_of_organisation %></p><br>
  <%end%>

<% if @funding.name_of_organisation.present? %>
 <%= @funding.name_of_organisation %>
  <% if current_user.superadmin? %>
    <%= link_to 'Add Organisation', '' %>
  <% end %>
<% end %>

3 个答案:

答案 0 :(得分:0)

您应该使用组织的ID而不是名称来将两个模型链接在一起。这就是ActiveRecord中关联的工作方式。

您的尝试存在一个巨大缺陷,即编辑组织名称将破坏任何关联。 ID不变。

首先生成一个迁移,以将外键列添加到资金表:

# rails g migration add_organization_to_fundings organization:belongs_to
how class AddOrganizationToFundings < ActiveRecord::Migration[5.0]
  def change
    add_reference :fundings, :organization, foreign_key: true
  end
end

如果您有任何通过名称链接的现有数据,则需要遍历并修复这些记录:

Funding.find_each(batch_size: 100) do |f|
  organization = Organization.find_by(name: f.name_of_organisation)
  f.update!(organization_id: organization.id)
end

然后,您应该编写迁移操作以删除fundings.name_of_organisation列。

然后,您需要设置适当的关联:

class Funding < ApplicationRecord
  belongs_to :organization
end

class Organization < ApplicationRecord
  has_many :fundings
end

然后您可以使用表单选项助手创建一个选择标签:

<%= form_for(@funding) do |f| %>
  <%= f.select :organization_id, Organization.all, :id, :name %>
<% end %>

答案 1 :(得分:0)

当您问“我该怎么做?”时,我知道这真令人生气。在stackoverflow上,他们说“不要”,但是在这种情况下,它非常干。不要这样子。

您要存储组织名称和地址等两次,一次用于资金投入,一次用于组织。这是一个非常糟糕的做法,当您要彻底更改任何内容时,它会咬住您。您只想存储组织表以及组织表的详细信息。将其从资金表中删除,然后添加外键以引用其所属的组织。

这些是非常基本的概念,您真的想花一点时间并进一步学习数据库。查找有关“关系数据库基础知识”的不错的讲座,文章或教程,并逐步进行学习。它不必(也可能不会)特定于rails。

然后,继续阅读Activerecord,尤其是关系。

要解决您的管理员批准问题,我要做的是向“组织”表中添加一个“批准的”布尔标志,以及一个仅适用于管理员批准的自定义控制器操作。您可以更进一步,为普通用户创建一个“批准的”范围,并为管理员创建一个“待定”范围或可见的范围。不过,这只是许多解决方案中的一种。

答案 2 :(得分:-1)

为了“添加组织” ..我将获取您尝试执行的逻辑方法的路径,并根据您打算使用js渲染还是重定向到remote:true的逻辑一个新的屏幕。