2010-04-04 7 views
0

Je cette requête et j'ai une erreur:problème Rails trouver par sql

images = Image.find_by_sql('PREPARE stmt FROM \' 
    SELECT * 
    FROM images AS i 
    WHERE i.on_id = 1 AND i.on_type = "profile" 
    ORDER BY i.updated_at 
    LIMIT ?, 6\ 
'; SET @lower_limit := ((5 DIV 6) * 6); EXECUTE stmt USING @lower_limit;') 

Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @lower_limit := ((5 DIV 6) * 6); EXECUTE stmt USING @lower_limit' at line 1: PREPARE stmt FROM ' SELECT * FROM images AS i WHERE i.on_id = 1 AND i.on_type = "profile" ORDER BY i.updated_at LIMIT ?, 6'; SET @lower_limit := ((5 DIV 6) * 6); EXECUTE stmt USING @lower_limit;

EDIT: après avoir trouvé la réponse à: i MySQL: I need to get the offset of a item in a query besoin d'une autre aide ici au port à rails.

Répondre

0

Je suppose que vous ne pouvez pas être autorisé à utiliser des ensembles de requêtes délimités par des points-virgules dans find_by_sql. Essayez de trouver un moyen d'utiliser simplement la méthode Happy Rails find (voir la réponse @ Sleepycat, par exemple).

0

Est-ce que ça étouffe juste sur les devis? Je suppose que cette déclaration fonctionne déjà sur mysql. Essayez ceci:

Image.find_by_sql("PREPARE stmt FROM \' 
    SELECT * 
    FROM images AS i 
    WHERE i.on_id = 1 AND i.on_type = 'profile' 
    ORDER BY i.updated_at 
    LIMIT ?, 6\ 
'; SET @lower_limit := ((5 DIV 6) * 6); EXECUTE stmt USING @lower_limit;") 
+0

J'ai cette erreur maintenant Mysql :: Erreur: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'profil' ORDER BY i.updated_at LIMIT?, 6 '; SET @lower_limit: = ((5 DIV 6) * 'à la ligne 1: PREPARER stmt FROM' SELECT * FROM images AS i O WH i.on_id = 1 ET i.on_type = 'profil' COMMANDER PAR i.updated_at ? LIMITE, 6' ; SET @lower_limit: = ((5 DIV 6) * 6); EXECUTE stmt UTILISATION @lower_limit; –

+0

maintenant ceci: Mysql :: erreur: Vous avez une erreur dans votre syntaxe SQL; vérifiez la manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'profil' ORDER BY i.updated_at LIMIT ?, 6 '; SET @lower_limit: = ((5 DIV 6) * 6);' à la ligne 1: PREPARER stmt FROM 'SELECT * FROM images AS i OERE i.on_id = 1 ET i.on_type =' profile 'ORDRE BY i.updated_at LIMIT ?, 6'; SET @lower_limit: = ((5 DIV 6) * 6); EXECUTE stmt UTILISER @lower_limit; –

0

J'ai pensé que je ferais une nouvelle réponse parce que j'ai manqué d'espace dans le commentaire. Je pense que vous pourriez rendre la vie compliquée pour vous avec cette déclaration. Je suis assez sûr que vous pouvez obtenir l'effet que vous recherchez avec moins de douleur avec une déclaration de recherche régulière de Rails. Il sera également plus portable (à travers les bases de données). Je ne comprends pas vraiment ce qui se passe là-bas, mais quelque chose comme ceci:

Image.find :all, :conditions => ["on_id = :on_id and on_type = :on_type", {:on_id => 1, :on_type => "profile"}], :order => "updated_at" :limit => (whatever calculation you are using to get your limit) 

La syntaxe est peut-être un peu hors mais il devrait vous mettre dans le parc de balle. En général, vous devriez essayer de garder la logique hors de la base de données et dans vos modèles.

+0

limite ne peux avoir aucune logique dans mon sql 5 ...: s c'est le problème ... –

+0

Si vous utilisez la recherche que j'ai écrite, le calcul se fait en Ruby et seul le résultat est passé à la base de données. : limite => 2 + 2 passera "limite 4" à la base de données. Ce n'est pas la base de données qui ajoute 2 à 2, son Ruby. Cette recherche fonctionnera sur n'importe quelle version de n'importe quelle base de données que Rails prend en charge. – mikewilliamson

+0

mais alors je reçois le même problème qu'auparavant, comment puis-je obtenir le décalage d'un élément dans une requête, commandé par updated_at? n'est pas par id, souvenez-vous. La limite est toujours 6, le décalage change. Le problème est expliqué ici: http://stackoverflow.com/questions/2566620/mysql-i-need-to-get-the-offset-of-a-item-in-a-query –