2014-07-16 66 views
0

我試圖創建一個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. 用戶發佈包含在哈希的附加數據的請求,其中關鍵=的itemlist_id他們想要什麼,價值=他們想要的itemlist_id的數量。比方說,用戶需要9箇中的兩個,如下所示:{9 => 2}
  2. 對於用戶提供的散列中的每個itemlist_id,我將查看庫存表內的內容並提取inventory_id,其中itemlist_id匹配用戶正在查找的內容以及該inventory_id的用戶不是用戶自己。假設在庫存表中,有3個ID可以滿足這個要求:[X,Y,Z]
  3. 現在我想要做的是創建屬於請求的事務(先前已經創建了請求)並將交易與存貨相互關聯。這一步的結果是兩方面的(我認爲這是更容易從什麼樣的觀點看起來像的角度寫:

    • 每個X,Y和Z inventory_id所有人應當看到,有2個交易爲他們的項目(所以他們可以選擇他們想要兌現哪一個)
    • ,用戶可以看到,他們的每個2交易,有通知給每個X,Y和Z的所有者

創建關聯的代碼

# 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 

這將引發一個錯誤,對創建的參數必須是一個哈希值。我也嘗試過:

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聯繫起來,對不對?

回答

0

最後有人在這裏回答了這個問題:Creating joined records using has_many :through

基本上我創建的Transaction屬於Request母公司,然後再與存貨像這樣相關的:

transaction.inventory_ids += matched_inventory_ids 

這新行替換這舊行代碼:

transaction.inventories.create matched_inventory_id 

是的,一旦它與單向關聯,雙向作品也是一種多對多的關係。

相關問題