2010-05-03 7 views
1

J'ai une requête dans mon code comme ci-dessouscomment convertir requête héritage à ActiveRecord Rails façon

@sqladdpayment = "INSERT INTO payments (orderid, ttlprodcost, paytype, 
paystatus,created_at,updated_at,userid,storeid) 
VALUES ('" + session[:ordersid] + "', '" + session[:totalcost] + "', '" 
+ "1"+ "', '" + "complete" +"',current_date, current_date, '"+"1"+"','"+ "1"+"')" 

Voici le tableau payments et clé primaire est orderid. Maintenant, je sais que si je convertir cela à la façon ActiveRecord alors je ne vais pas avoir à mettre update_date, current_date parce qu'il mettra que sur son propre. Il mettra également orderid sur lui-même aussi (auto_increment).

Je suis à la recherche d'un moyen de convertir la requête ci-dessus à ActiveRecord Rails chemin mais toujours être en mesure de mettre orderid sur mon propre (session[:ordersid]). Je ne veux pas compter sur auto_increment parce que je devrai refactoriser beaucoup de l'autre code. Cela pourrait être une solution rapide et sale, mais je veux savoir si ce type de flexibilité est offert dans les rails?

Je me suis posé la question à plusieurs reprises. Pourquoi les rails ne me permettent-ils pas d'avoir cette flexibilité?

Répondre

0

Vous semblez aller à beaucoup d'ennuis, ou je manque peut-être quelque chose. La façon ActiveRecord de faire chose est, IMHO manuellement

payment = Payments.new 
payment.orderid = session[:ordersid] 
payment.totalcost = session[:totalcost] 
payment.paytype = 1 
payment.paystatus = "complete" 
payment.userid = 1 
payment.storeid = 1 
payment.save 

Maintenant, si vous avez une forme remplir ces champs, il est encore plus facile:

payment = Payment.new(params[:payment]) 
payment.save 

Il n'y a donc pas besoin d'un champ d'auto-incrémentation. Si vous spécifiez que «ordersid» est l'identifiant, vous pouvez toujours définir la valeur manuellement, ce qui annulera le comportement standard des rails (sauf si vous avez défini le champ à auto-incrémenter dans la base de données).

Par exemple: an article montrant comment utiliser UUID au lieu de autoincrement.

J'ai une remarque, quand je vois ce code. Normalement pour userid et storeid on utiliserait les capacités relationnelles inhérentes intégrées dans les rails. Par exemple, si un paiement est lié à un utilisateur, vous ne soit

user.payments.build(params[:payment]) 

et le paiement nouvellement créé est automatiquement lié à l'utilisateur. Ou

payment.user = current_user 

si vous auriez quelque chose comme

belongs_to :user 

dans votre modèle. Peut-être que vous êtes déjà au courant de tout cela, c'est difficile à rattraper à partir de votre question.

Questions connexes