创建一个具有两个关联的记录

时间:2014-07-16 01:48:36

标签: ruby-on-rails ruby-on-rails-4 has-many-through

我正在尝试创建Transaction同时是Request的孩子,也是Inventory的多对多关系中的一部分。

型号代码:

class Transaction < ActiveRecord::Base
  belongs_to :request
  has_many :transactories
  has_many :inventories, through: :transactories
end

class Inventory < ActiveRecord::Base
  has_many :transactories
  has_many :transactions, through: :transactories
end

class Transactory < ActiveRecord::Base
  belongs_to :inventory
  belongs_to :transaction
end

以下是我想要实现的流程:

  1. 用户在哈希中发布包含其他数据的请求,其中key =他们想要的itemlist_id,值=他们想要的itemlist_id的数量。假设用户想要9中的两个,看起来像这样:{9 =&gt; 2}
  2. 对于用户提供的哈希中的每个itemlist_id,我将查看Inventories表并拉出inventory_id,其中itemlist_id与用户正在查找的内容匹配,而inventory_id的所有者不是用户自己。假设在Stockories表中有3个ID可以实现:[X,Y,Z]
  3. 现在我要做的是创建属于请求的交易(先前已创建请求)并将交易和库存相互关联。这一步的结果是双重的(我认为从视图的外观来看更容易编写:

    • 每个X,Y和Z inventory_id的所有者应该看到他们的项目有2个交易(因此他们可以选择他们想要的那个)
    • 用户可以看到,对于他们的2个交易中的每个交易,都会向每个X,Y和Z的所有者发送通知
  4. 创建关联的代码

    # Assume overarching parent request has been created, called @requestrecord
    # Step 1, @transactionparams = { 9 => 2 }
    @transactionparams.each do |itemlist_id, quantity|
    # Step 2 matched_inventory_id = [X,Y,Z] 
          matched_inventory_id = Inventory.where.not(signup_id: @requestrecord.signup.id).where(itemlist_id: itemlist_id).ids 
    # Step 3, 2 transactions created each with itemlist_id of 9, each associated with inventory_ids X, Y, Z. In turn, inventory_ids X, Y, Z each associated with each of the two transactions created
          quantity.to_i.times do
             transaction = @requestrecord.transactions.create(itemlist_id: itemlist_id) 
             transaction.inventories.create matched_inventory_id
          end
        end
    

    我无法做到的路线是第3步:

    transaction.inventories.create matched_inventory_id
    

    这会抛出一个错误,即create的参数必须是哈希值。我也尝试过:

    matched_inventory_id.each do |id|
      transaction.inventories.create(inventory_id: id)
    end
    

    此操作失败,因为inventory_id不是有效属性。 所以...两个问题:

    1. 如何将每个X,Y,Z库存ID与每个交易1和2相关联?
    2. 如果我写一行代码来实现上述目标,可以想象(希望如此),我也实现了反向关联? has_many :through中的含义,只要我将InventoryTransactions相关联,我就会自动将TransactionsInventories相关联,对吗?

1 个答案:

答案 0 :(得分:0)

最后有人回答了这个问题:Creating joined records using has_many :through

基本上我首先创建属于Transaction父级的Request,然后将其与库存相关联,如下所示:

transaction.inventory_ids += matched_inventory_ids 

这一新行取代了旧的代码行:

transaction.inventories.create matched_inventory_id

是的,一旦它与一种方式相关联,双向也起作用,因为它是一种多对多的关系。