我有一个股份的概念,代表特定股东拥有的特定股票。我现在要添加的功能是支持随时间推移跟踪此股票的“历史记录”,因为它可以转移给其他股东等。
在我的数据库中,对于每个private static void collectProperties(VimPortType methods,
ServiceContent sContent) throws
Exception {
ManagedObjectReference viewMgrRef = sContent.getViewManager();
ManagedObjectReference propColl = sContent.getPropertyCollector();
List<String> vmList = new ArrayList<String>();
vmList.add("HostSystem");
vmList.add("VirtualMachine");
ManagedObjectReference cViewRef = methods.createContainerView(viewMgrRef,
sContent.getRootFolder(),
vmList,
true);
ObjectSpec oSpec = new ObjectSpec();
oSpec.setObj(cViewRef);
oSpec.setSkip(true);
TraversalSpec tSpec = new TraversalSpec();
tSpec.setName("traverseEntities");
tSpec.setPath("view");
tSpec.setSkip(false);
tSpec.setType("ContainerView");
oSpec.getSelectSet().add(tSpec);
PropertySpec guestSpec = new PropertySpec();
guestSpec.setType("VirtualMachine");
guestSpec.getPathSet().add("name");
guestSpec.getPathSet().add("guest.guestFullName");
guestSpec.getPathSet().add("guest.ipAddress");
guestSpec.getPathSet().add("runtime.host");
guestSpec.getPathSet().add("runtime.maxCpuUsage");
guestSpec.getPathSet().add("runtime.maxMemoryUsage");
guestSpec.getPathSet().add("runtime.powerState");
PropertyFilterSpec fSpec = new PropertyFilterSpec();
fSpec.getObjectSet().add(oSpec);
fSpec.getPropSet().add(guestSpec);
List<PropertyFilterSpec> fSpecList = new ArrayList<PropertyFilterSpec>();
fSpecList.add(fSpec);
RetrieveOptions ro = new RetrieveOptions();
ro.setMaxObjects(null);
RetrieveResult retrieveResult = methods.retrievePropertiesEx(propColl,fSpecList,ro);
RetrieveResult continuedResult = methods.continueRetrievePropertiesEx(propColl,retrieveResult.getToken());
List<RetrieveResult> resultList = new ArrayList<RetrieveResult>();
resultList.add(retrieveResult);
resultList.add(continuedResult);
for (RetrieveResult result: resultList) {
if (result != null) {
for (ObjectContent oc : retrieveResult.getObjects()) {
List<DynamicProperty> dps = oc.getPropSet();
if (dps != null) {
for (DynamicProperty dp : dps) {
String path = dp.getName();
System.out.println(dp.getVal());
}
System.out.println("---------------------");
}
}
}
}
}
记录,当前都有一列Share
。我可能应该将假设的列类型更改为更易于使用的列。在这里开放建议。
两种相关方法是创建新股份然后转移股份所有权。
这是最初创建共享的方式。
t.string "transaction_ids"
然后,当传输@number_of_share_numbers_to_create.times do |i|
Share.create(
owner_id: params[:buying_shareholder_id],
captable_id: @transaction.captable.id,
company_id: @transaction.company.id,
share_number: @latest_share += 1,
transaction_ids: @transaction.id #Save transaction id to DB
)
end
时,我具有以下方法。
Share
我知道当前的解决方案不是最佳解决方案,我希望获得有关如何以更可扩展的方式解决此问题的指导。也许我应该使用其他列类型并构建一个数组?希望朝正确的方向前进。
谢谢!
答案 0 :(得分:2)
您可以使用数组列类型(如果使用postgres)。但是我要做的是将事务ID移到单独的数据库表中。它将使您轻松添加新的ID并快速查询它们。
答案 1 :(得分:2)
我建议创建另一个模型以“记录”特定Share
对象发生的交易。
例如:
class ShareTransfer < ApplicationRecord
belongs_to :share
belongs_to :transaction
# don't forget to enforce the presence of
# both foreign keys share_id and transaction_id
# bonus: "freezing" the object after creation so you can never
# update the logged object (= data integrity)
before_save(on: :update) do
errors.add(:base, :immutable, "Cannot update a frozen object")
end
end
然后将您当前的Share#transaction_ids
更改为简单的integer
列,并在transactions
表中添加外键-可能也对其进行重命名-最终得到以下结果:>
class Share < ApplicationRecord
belongs_to :transaction # implies you have renamed the column transaction_ids to transaction_id (and changed the column type)
has_many :share_transfers
end
转移Share
后,您可以执行以下操作:
@share_numbers_on_cap.each do |share|
# [your previous logic to change ownership]
share.share_transfers.create!(transaction_id: share.transaction_id)
# ^ to create history of the ownership change
end
此架构允许您向ShareTransfer
模型中添加其他字段,例如,发生转移的确切时间(例如:occurred_at
),验证转移时双方的IP等等。您甚至可以将lock
表ShareTransfer
设为“仅插入”,从而防止任何用户(或代码)更新其中的数据并确保日志的完整性。