2010-07-15 5 views
1

J'ai besoin d'effectuer ces SQL ci-dessous, mais je n'ai pas pu obtenir le résultat.SQL personnalisé ActiveRecord dans Ruby

newid=Header.find_by_sql(
    "SELECT coalesce(max(transaction_id),0)+1 AS id 
    FROM transaction_headers 
    WHERE transaction_year = #{Time.now.year} AND 
    transaction_type='#{fields[:transaction_type]}'" 
) 

Mais je n'arrive pas à obtenir le résultat à newid. La seule valeur que j'ai eu était [# < En-tête >] Quelqu'un peut-il m'aider à créer la déclaration correcte pour Ruby?

EDIT: Tableau des champs

 
----------------------------------------------------------------------------------- 
| transaction_type | transaction_year | transaction_id | customer_id | uid | date | 
----------------------------------------------------------------------------------- 

Merci.

Répondre

2

Vous obtenez un objet Header (qui sera rempli avec un ID), donc je pense que dans votre cas, newid.id vous donnera réellement l'ID que vous cherchez, ou si vous voulez un tableau de ces valeurs faire:

headers = Header.find_by_sql(...) 
header_ids = headers.collect(&:id) 

HTH

+0

Merci. Je pense que j'ai fait un pas en avant. J'ai essayé ça, et j'ai récupéré l'objet Header, mais quand j'ai essayé de collectionner, j'ai obtenu [néant, néant, néant]. Je suis sûr que la requête est correcte. Il devrait retourner 1 champ avec l'identification de nom. Une idée? EDIT: J'ai ajouté des champs de table – Magician

+0

Donc, votre clé primaire pour le modèle est en réalité transaction_id? Ensuite, essayez ceci: têtes = Header.find_by_sql ( « SELECT COALESCE (max (transaction_id), 0) +1 AS transaction_id DE transaction_headers OÙ transaction_year = # {} Time.now.year ET TRANSACTION_TYPE = '# { champs [: TRANSACTION_TYPE]} » ) header_ids = headers.collect (&: transaction_id) Je ne sais pas si cela va aider, mais peut-être la peine d'essayer – rainkinz

+0

Oh .. ok .. merci .. vais essayer maintenant . En fait, les clés primaires sont les suivantes: transaction_id, transaction_type et transaction_year. Et Ruby a continué à envoyer la clause ORDER par ces clés et à supprimer les conditions du champ transaction_type. J'ai donc dû recourir au SQL manuel. – Magician

0

Ce que vous obtenez en retrait de la find est un tableau d'objets d'en-tête.

headers = Header.find_by_sql(...) 
newid = headers.first.id 

Je pourrais me demander pourquoi je dois le id si

+0

J'ai essayé cela, et j'ai obtenu zéro à la place. – Magician

+0

La convention Rails exige que la clé primaire soit appelée 'id'. Si vous créez des tables à partir de zéro, je vous recommande fortement de respecter la convention. –

+0

Je ne peux pas .. Ma clé primaire se compose de 3 clés, transaction_id, transaction_year et transaction_type. Je vais avoir beaucoup d'id, et ce serait confus pour lequel ID est lequel. – Magician

Questions connexes