我正在努力研究一个概念。我有一个名为Transactions
的概念。每个交易可以包含一个特定的number_of_stocks
(例如10)。
我现在正在寻找的是为每个Share
创建一个新记录(number_of_stocks
)。
示例:如果@transaction.number_of_stocks
= 10,那么我们应该创建10个新的Share记录。
如果我一次只创建一个,下面的代码将起作用,但是我还没有找到一种方法来根据@transaction.number_of_stocks
变量创建数量可变的新记录。
此外,为了使事情更棘手,每个Share
都有一个属性share_number
。我想做的是,对于每个创建的新Share记录,share_number应该增加,但是它还应该检查是否已经存在属于上限表的任何现存share_number,然后“从那里开始”。
仅出于上下文考虑,我可能会将此功能包装到TransactionsHelper
中的某个地方,以便可以在其他地方使用它。
很多问题,但确实有一个问题-感谢您的帮助! :)
@number_of_share_numbers_to_create = @transaction.number_of_stocks # Example: 10
Share.create( #TODO: Now we need to create 10 records here
owner_id: params[:buying_shareholder_id],
captable_id: @transaction.captable.id,
company_id: @transaction.company.id,
share_number: #TODO: Increment based on the latest share_number linked to this captable and then for each new record in this transaction
)
模型
class Share < ApplicationRecord
belongs_to :captable
belongs_to :company
end
答案 0 :(得分:2)
您需要查看Integer
上的times方法。也许是这样的:
@transaction.number_of_stocks.times do |i|
Share.create( #TODO: Now we need to create 10 records here
owner_id: params[:buying_shareholder_id],
captable_id: @transaction.captable.id,
company_id: @transaction.company.id,
share_number: #TODO: Increment based on the latest share_number linked to this captable and then for each new record in this transaction
)
end
如您在上面的评论中所述,如果number_of_stocks
确实是decimal
而不是integer
,那么您将需要摆弄才能制作times
工作并管理小数shares
。但这是另一个问题。
顺便说一句,您将始终只交易股票吗?其他资产形式(例如债券),衍生工具(例如期权)或其他可交易资产/工具呢?如果某个时候您将要处理其他资产/工具,那么您可能现在要考虑一下。只是一个想法。
答案 1 :(得分:0)
我用以下内容解决了share_number
件
一种获取最新share_number
的快速方法
def get_latest_share_number_from_captable(captable)
@captable = Captable.find(captable.id)
@shares = @captable.shares
@share_numbers = []
@shares.each do |s|
@share_numbers.push(s.share_number)
end
@latest_share = @share_numbers.max
return @latest_share
end
然后,我使用该方法和建议的.times
解决方案来创建新记录。
# Add share numbering for this transaction
@number_of_share_numbers_to_create = @transaction.number_of_stocks.to_i
# Get last sharenumber in captable
@latest_share = get_latest_share_number_from_captable(@transaction.captable)
@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 #Increment for each new record
)
end