2014-07-16 3 views
0

J'essaye de créer un Transaction qui est simultanément l'enfant d'un Request et également une partie dans une relation many-to-many d'un Inventory.Créer un enregistrement qui a deux associations

Code du modèle:

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 

Voici le flux que je suis en train de réaliser:

  1. POSTs utilisateur une demande qui contient des données supplémentaires dans un hachage où key = le itemlist_id de ce qu'ils veulent et la valeur = la quantité de cet itemlist_id qu'ils veulent. Supposons que l'utilisateur en ait besoin de deux, ce qui ressemblerait à ceci: {9 => 2}
  2. Pour chaque itemlist_id du hash fourni par l'utilisateur, je vais regarder à l'intérieur de la table Inventories et sortir les inventory_ids où l'itemlist_id correspond à ce que l'utilisateur recherche et le propriétaire de cet ID d'inventaire n'est pas l'utilisateur lui-même. Disons que dans la table des stocks, il y a 3 identifiants qui remplissent ceci: [X, Y, Z]
  3. Maintenant, ce que je voudrais faire est de créer les transactions qui appartiennent à la demande (la demande a déjà été créée plus tôt) et associer les Transactions et les Stocks entre eux. Le résultat de cette étape est de deux fois (je pense qu'il est plus facile d'écrire du point de vue de ce que la vue ressemblera:

    • que le propriétaire de chaque X, Y et Z inventory_id devrait voir qu'il ya 2 transactions pour leur article (afin qu'ils puissent choisir celui qu'ils veulent honorer)
    • que l'utilisateur peut voir que pour chacune de leurs 2 transactions, il y a des notifications aux propriétaires de chaque X, Y et Z

Code pour créer les associations

# 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 

La ligne que je ne peux pas obtenir le droit est à l'étape 3:

transaction.inventories.create matched_inventory_id 

Ce génère une erreur que les paramètres pour créer doivent être un hachage. J'ai également essayé:

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

Échec parce que inventory_id n'est pas un attribut valide. Alors ... deux questions:

  1. Comment associer chacun des X, Y, id inventaire de Z à chaque transaction 1 et 2?
  2. Si j'écris une ligne de code pour atteindre ci-dessus, peut-être (espérons-le), j'ai réalisé l'association inverse aussi bien? Signification dans un has_many :through, tant que j'associe Inventory avec Transactions, j'associe automatiquement aussi Transactions avec Inventories, non?

Répondre

0

Enfin quelqu'un a répondu à cette question ici: Creating joined records using has_many :through

Fondamentalement, je créé le Transaction appartenant au parent Request d'abord, puis associée avec les stocks comme si:

transaction.inventory_ids += matched_inventory_ids 

Cette nouvelle ligne a remplacé cette ancienne ligne de code:

transaction.inventories.create matched_inventory_id 

Et oui, une fois que c'est associé d'une certaine manière, le bidirectionnel fonctionne également puisque c'est une relation plusieurs-à-plusieurs.

Questions connexes