我正在尝试创建一个基本模型"客户端":
class CreateClients < ActiveRecord::Migration[7.0]
def change
create_table :clients do |t|
t.string :name
t.timestamps
end
end
end
客户有一个审核列表:
class CreateAudits < ActiveRecord::Migration[7.0]
def change
create_table :audits do |t|
t.references :client, null: false, foreign_key: true
t.timestamps
end
end
end
每个客户都有一份审计清单。那部分很简单。我有点不确定的是如何在每次审计中添加客户端。我的意思是。。。客户有自己的名字,我们希望每年左右进行一次审计,客户可以审查他们的每个字段并进行更改,通过审批流程,然后最终更改客户属性。
我希望Audit为"have_a"客户端,这样我就可以在将客户端的审核更改推回到基本客户端并结束审核之前跟踪这些更改。
它应该看起来像这样:
Client
name
has_many Audits
Audit
status
belongs_to Client
has_a Client # named tempClient or something --> How do I create this relation?
我一直收到错误:
➜ project_rails git:(main) ✗ rake db:migrate
== 20221028145314 AddClientToAudits: migrating ================================
-- add_reference(:audits, :client, {:null=>false, :foreign_key=>true})
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
you can't define an already defined column 'client_id'.
如何创建审核的子客户端
--编辑--
阐述:
一种解决方案是在客户端的审核中保持相同的属性。但是,人们必须记住他们什么时候,比如说,向客户添加地址,然后再向审计添加一个名称完全相同的地址。这就是我尝试重用客户端对象的原因——任何添加到客户端的属性都会自动添加到审核中。
对解决方案的其他想法也持开放态度。
如果我正确地跟踪您,那么您的数据库中已经设置了正确的关系。查看您的structure.sql
或schema.rb
文件,确认这些关系已经正确。另一种确认方法是使用rails console
创建一个垃圾客户端,一个垃圾审计,并将它们关联起来。然后尝试audit.client_id
以确认其已存在。
我认为您需要做的是将以下内容添加到Rails模型文件中,这样您就可以在代码中引用来自审计的客户端。
类似:
class Audit < ApplicationRecord
# other attributes
belongs_to :client, required: true
# ...
end
现在您可以说audit.client
来进行更新。