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:
- 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}
- 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]
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:
- Comment associer chacun des X, Y, id inventaire de Z à chaque transaction 1 et 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'associeInventory
avecTransactions
, j'associe automatiquement aussiTransactions
avecInventories
, non?