我有一个资金表,其中有一个字段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 %>
答案 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
的逻辑一个新的屏幕。