一次创建可变数量的新ActiveRecord记录Rails

时间:2018-11-27 19:13:13

标签: ruby-on-rails

我正在努力研究一个概念。我有一个名为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

2 个答案:

答案 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