help seconde appli ror

help seconde appli ror - Ruby/Rails - Programmation

Marsh Posté le 06-01-2009 à 14:11:05    

Bonjour,
bon faire un  crud sur l exmple du blog ok
mais apres qd on a des cardinalites entre table j'suis perdu
ex tt bete une bibliotheque
une table livres une table emprunts une table usagers
 
alors j ai fait mon script sql et j ai donc ma base dans oracle
jusque la ok ;)
deja si je parts comme ca et que j utilise donc pas le db migrate je vais avoir des pbs?
 
apres dans le model je fais 3 classes livre, emprunt et usager avec les cardinalites has_may, belongs_to
 
j ai fait mon controller pour livre qui m affiche les livres et la je voudrais simplement pouvoir cliker sur le livre et afficher sur la meme page le contenu de la table emprun et usager lié a l identifiant de ce livre
mais c'est la que je suis plus...
 
si vous avez du code source sur une application assez simple je suis preneur merci ;)


Message édité par schum-hacker le 06-01-2009 à 14:11:44
Reply

Marsh Posté le 06-01-2009 à 14:11:05   

Reply

Marsh Posté le 06-01-2009 à 14:31:25    

J'ai strictement rien compris.
Tu peux t'exprimer en français, en expliquant tranquillement et clairement ce qu pose problème, etc..?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-01-2009 à 15:39:52    

Déjà ne pas utiliser les migrations, c'est (très) mal partir. Ensuite Oracle et Rails c'est pas très courant.
 
Pour le reste ça serait quelque chose comme:
@books = Book.find(:all, :joins => :user)
 
Puis il faudrait poster un minimum de code sinon on peut pas aider.


Message édité par igarimasho le 06-01-2009 à 15:41:24
Reply

Marsh Posté le 06-01-2009 à 16:08:58    

lol alors pour oracle en j ai pas le choix ca m est imposé ;)
 
j ai trouvé find_by_sql qui m aide bien a resoudre mes pbs
 
mais ce qu il me faudrait ca serait les sources d un mini projet genre une connexion admin
ca me permettrait de comprendre vraiment le baba  
ca serait super cool MERKI

Reply

Marsh Posté le 06-01-2009 à 16:27:11    

find_by_sql ne doit PAS être utilisé, sauf si on fait des choses particulièrement exotiques pour qu'elles ne soient pas supportées par Rails , ce qui n'est absolument pas ton cas.
 
Ensuite, comme l'a dit igarimasho, si tu pars sans utiliser les migrations, t'es déjà très mal barré. Apprend à les utiliser, ça peut être très utile.. Surtout que c'est vraiment pas sorcier.
 
Si j'ai bien compris (mais là c'est limite deviner parce que tu n'as toujours pas expliqué ton problème en français) :
 
Tu as plusieurs livres. Chaque livre correspond à 1 utilisateur mais chaque utilisateur peut avoir plusieurs livres ( relation 1-n  ), idem pour emprunts (un livre peut être emprunté par un seul utilisateur, mais chaque utilisateur peut avoir plusieurs emprunts à son nom) ?
 
C'est ça ?
 


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-01-2009 à 16:40:19    

A mes débuts je suis aussi passé par la case find_by_sql et j'ai amèremment regretté. Il faut utiliser Rails dans la manière dont ça a été prévu, sinon aïe.
 
Come exemple de code, tu as Railscasts: c'est simple, clair et ça ne cherche pas à bypasser la magie de Rails.

Reply

Marsh Posté le 06-01-2009 à 16:43:07    

Heureusement dans mon livre de Rails il y avait bien écrit ça, donc je ne suis pas tombé dans le piège :D


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-01-2009 à 17:13:47    

en gros j essaie de faire un exemple tout bete pour comprendre avec genre une connexion, et sinon pour les tables les cardinalites sont:
 
j ai pas utilisé le db migrate quel est l interet de l utiliser????

Code :
  1. donc la ce sont mes models:
  2.  
  3. class Livre < ActiveRecord::Base
  4.  has_many :emprunts
  5. end
  6.  
  7. class Emprunt < ActiveRecord::Base
  8.  belongs_to :livre
  9.  belongs_to :usager
  10. end
  11.  
  12. class Usager < ActiveRecord::Base
  13.  has_many :emprunts
  14. end
  15.  
  16. comme controller:
  17.  
  18.  
  19. class LivresController < ApplicationController
  20.  def index
  21.    @livres = Livre.find(:all)
  22. end
  23. end
  24.  
  25. et comme view ds le rep livres un index.html:
  26.  
  27. <h1>Listing livres</h1>
  28.  
  29. <table>
  30.  <tr>
  31.    <th>Title</th>
  32.    <th>Body</th>
  33.  </tr>
  34.  
  35. <% for livre in @livres %>
  36.  <tr>
  37.    <td><%=h livre.nom %></td>    
  38. </tr>
  39. <% end %>
  40. </table>

Message cité 1 fois
Message édité par gilou le 07-01-2009 à 15:05:24
Reply

Marsh Posté le 06-01-2009 à 17:14:58    

voila mes kestions j en ai des millions lol
mais genre j aimerais lister les usagers ki ont emprunter ce livre?
et j y arrive qu avec  find_by_sql

Reply

Marsh Posté le 06-01-2009 à 17:35:14    

D'accord on comprend déjà mieux  ... (Même si tu pourrais mettre le code entre balises "code=ruby" pour la coloration)

 

Donc là ce qui te manque, c'est précisément les foreign keys qui se font très facilement avec les migrations. Prend un manuel de Rails, regarde le chapitre sur les migrations et comment créer des foreign keys (y a un plugin qui peut simplifier la vie ( http://www.redhillonrails.org/fore [...] tions.html ).

 

Une fois que tout sera en place, tu pourras très simplement afficher ta liste avec :

 
Code :
  1. <% for emprunt in livre.emprunts %>
  2.  <%=h emprunt.usager.nom %>
  3. <%end%>
 

Edit : On t'as dit à 2 de ne pas utiliser find_by_sql, qui est la meilleure manière pour démolir ton application en mélangeant présentation,métier et persistance, outre qu'en introduisant des failles potentielles comme des SQL injections.


Message édité par esox_ch le 06-01-2009 à 17:36:57

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-01-2009 à 17:35:14   

Reply

Marsh Posté le 06-01-2009 à 17:40:51    

j ai fait un db migrate sous aptana et on dirait qu il m a rapatrié ma base, j ai desormais un fichier schema.rb qui contient:

Code :
  1. ActiveRecord::Schema.define(:version => 0) do
  2.   create_table "emprunts", :force => true do |t|
  3.     t.integer "livres_id",  :precision => 38, :scale => 0, :null => false
  4.     t.integer "usagers_id", :precision => 38, :scale => 0, :null => false
  5.     t.integer "sortie",     :precision => 38, :scale => 0
  6.     t.integer "retour",     :precision => 38, :scale => 0
  7.   end
  8.   add_index "emprunts", ["livres_id"], :name => "livres_has_usagers_fkindex1"
  9.   add_index "emprunts", ["usagers_id"], :name => "livres_has_usagers_fkindex2"
  10.   create_table "livres", :force => true do |t|
  11.     t.string "titre"
  12.     t.string "auteur"
  13.     t.string "isbn",   :limit => 13
  14.   end
  15.   create_table "usagers", :force => true do |t|
  16.     t.string "nom",     :limit => 50
  17.     t.string "adresse", :limit => 50
  18.   end
  19. end


Message édité par schum-hacker le 06-01-2009 à 17:41:19
Reply

Marsh Posté le 06-01-2009 à 17:43:20    

j ai desormais une erreur plus encouragente
 
OCIError: ORA-00904: "EMPRUNTS"."LIVRE_ID" : identificateur non valide: SELECT * FROM emprunts WHERE (emprunts.livre_id = 2)

Reply

Marsh Posté le 06-01-2009 à 17:44:32    

Tu peux nous lire, stp , ce qu'il y a marquer en commentaire avant tout ça? C'est pas marqué qqch du style "DO NOT EDIT THIS FILE" ?
 
Tu peux m'expliquer pourquoi tu ne veux pas écouter des gens qui ont plusieurs développements Rails à leur actif et tu continues à faire tout à ta guise? Parce que si nos remarques/conseils te dérangent, on peut très bien partir de ce topic et te laisser continuer tout seul hein ..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-01-2009 à 17:47:55    

Tu peux nous lire, stp , ce qu'il y a marquer en commentaire avant tout ça? C'est pas marqué qqch du style "DO NOT EDIT THIS FILE" ?  
???
 
euh j essaie des trucs car je suis perdu c'est pas que je veux pas mais je comprends pas tout dsl  :jap:

Message cité 1 fois
Message édité par schum-hacker le 06-01-2009 à 17:48:02
Reply

Marsh Posté le 06-01-2009 à 17:48:14    

schum-hacker a écrit :


Code :
  1. class LivresController < ApplicationController
  2.   def index
  3.     @livres = Livre.find(:all)
  4. end
  5. end




Tu te prends pas du n+1 dans la tête avec cette requête si dans la view tu mets une boucle? Regarde le SQL envoyé. Sinon il faudra que tu ajoutes un :include ou un :joins selon le résultat voulu: livre.nom ou livre.usager.nom
 
Et sinon les noms de variable en français perso je peux pas.
 
Les migrations ça va te forcer à ne pas bricoler la DB à la main, et ça t'évitera te flinguer le serveur de production qui sera totalement désynchronisé de ta machine de dévelopment. Je parle d'expérience personnelle  :whistle:
 
EDIT: schema.db, LE fichier essentiel sous Rails à ne pas toucher. Expérience personnelle encore  :whistle:  Sinon à chaque migration, Rails va mettre à jour ce fichier tout seul donc c'est normal, mais ne commence pas à jouer avec, c'est "for your eyes only".


Message édité par igarimasho le 06-01-2009 à 17:51:32
Reply

Marsh Posté le 06-01-2009 à 18:28:59    

schum-hacker a écrit :

Tu peux nous lire, stp , ce qu'il y a marquer en commentaire avant tout ça? C'est pas marqué qqch du style "DO NOT EDIT THIS FILE" ?  
???
 
euh j essaie des trucs car je suis perdu c'est pas que je veux pas mais je comprends pas tout dsl  :jap:


 
Premières lignes de mon schemas.rb  
 

Citation :


# This file is auto-generated from the current state of the database. Instead of editing this file,  
# please use the migrations feature of Active Record to incrementally modify your database, and
# then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
# to create the application database on another system, you should be using db:schema:load, not running
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended to check this file into your version control system.
 


 
Donc comme te l'a dit igarimasho => Pas touche. Pour la dernière fois (si tu reviens sans l'avoir fait, je ne peux plus rien pour toi, et tu ne recevras plus d'aide de ma part) prend un livre/tutorial/... de Rails et lit le chapitre sur les migrations. Ton problème peut être résolu en 10 min une fois que tu auras compris comment marchent les migrations et les foreign keys (en plus je t'ai déjà écrit le code :o )
 
Igarimasho > Pas besoin de join ou include dans ce cas. S'il définit comme il faut les foreign keys dans son fichier de migration et que le modèle est bien configuré (là ça semble correcte), Rails écrira directement la bonne requête quand il appellera le bout de code que j'ai écrit... C'est assez cool parce que une fois que tu as défini les relations entre tes tables, tu te casses plus la tête à savoir ce que tu dois joindre avec quoi, rails s'en occupe..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-01-2009 à 19:02:14    

esox_ch a écrit :


Igarimasho > Pas besoin de join ou include dans ce cas. S'il définit comme il faut les foreign keys dans son fichier de migration et que le modèle est bien configuré (là ça semble correcte), Rails écrira directement la bonne requête quand il appellera le bout de code que j'ai écrit... C'est assez cool parce que une fois que tu as défini les relations entre tes tables, tu te casses plus la tête à savoir ce que tu dois joindre avec quoi, rails s'en occupe..


C'est bon ça. C'est apparu quand? Parce que j'avais pris l'habitude de systématiquement mettre mes propre :joins à cause de ça, sauf que pour gérer les named scope c'est un peu plus pénible du coup.
 
Et Rails insère forçément un :include? Il y a quand même une bonne différence de perf je trouve.

Reply

Marsh Posté le 06-01-2009 à 19:22:48    

Salut,
Je sais pas depuis quand .. avant le 1.8 en tous cas (c'est là que j'ai commencé à l'utiliser).
 
Donc, j'ai une classe User et Role, qui ont une relation n-n :
 
>> User.find(:all)

Citation :


  User Load (19.7ms)   SELECT * FROM `users`  
  User Columns (0.8ms)   SHOW FIELDS FROM `users`
  User Indexes (0.2ms)   SHOW KEYS FROM `users`


 
>> User.find(:first).roles

Citation :


  User Load (0.1ms)   SELECT * FROM `users`  
  Join Table Columns (0.5ms)   SHOW FIELDS FROM `roles_users`
  Role Load (0.0ms)   SELECT * FROM `roles` INNER JOIN `roles_users` ON `roles`.id = `roles_users`.role_id WHERE (`roles_users`.user_id = 1 )


 
Voilà :)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-01-2009 à 19:51:43    

Tu veux dire Rails 1.2? La version 1.8 n'a jamais existé sauf pour Ruby ;)
 
Sinon les choses ont changé, parce qu'avant ça crachait une gigantesque jointure avec AS t0_r0, ... AS t1_r1 je sais plus quoi, et c'était ultra lent.
 
Bon ben je vais ré-écrire un peu le code de mes Model avec ça. Merci :)

Reply

Marsh Posté le 06-01-2009 à 19:56:15    

1.2 effectivement, sorry :)
J'espère que l'auteur du topic reviendra et qu'il aura compris comment marchent les migrations :)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-01-2009 à 21:40:25    

Au fait esox, il y a un named_scope par défaut qui te permet de faire: User.all au lieu de User.find(:all), et idem avec first.
 
Par contre avec User.find(:first).roles, c'est bizarre, pourquoi AR fait un SELECT * FROM users suivi d'une jointure?
 
Il devrait faire 1 requête simple pour trouver le bon user, et à partir du résultat, envoyer le user_id dans une autre requête simple sans jointure. Ou alors faire 1 seule requête avec jointure. Bizarre.

Reply

Marsh Posté le 06-01-2009 à 23:30:04    

Salut,
 
Comme ça je vois pas trop pourquoi il fait cette requête.. Mais faut dire que je suis pas du tout actif dans le développement de Rails (manque de temps).
 
En ce qui concerne les named scope, je l'ai lu mais je suis pas fan. C'est vrai que c'est plus court, mais je trouve plus facile de m'y retrouver avec le find()


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 07-01-2009 à 12:47:47    

Je crois avoir compris pourquoi il exécute cette requête comme ça :D
Regarde le temps demandé par chaque requête.. Il exploite le pooling de MySQL, donc en appelant une requête qui, il y a fort à parier, sera utilisé dans la même page (Celle qui prend tous les utilisateurs) il permet à MySQL de rapidiser la requête de jointure .. Et donc au final il n'y perd pas grand chose en perf.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 07-01-2009 à 13:56:55    

Ouais ça marche sur une petite DB, mais quand elle va grossir, le SELECT * FROM users, il va faire mal.
 
il aurait du faire: SELECT * FROM users WHERE id=1
 
Puis, SELECT * FROM roles WHERE user_id = 1

Reply

Marsh Posté le 07-01-2009 à 14:57:59    

Tu as tout à fait raison, en fait c'est ma faute, j'ai sorti la mauvaise ligne (je lui avais balancé un User.find(:all)[0] pour voir ce qu'il disait).
Si je fais User.find(:first).roles , il fait un SELECT * from user limit 1 :jap:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 07-01-2009 à 19:47:11    

Ok :D

Reply

Marsh Posté le 08-01-2009 à 08:41:51    

je regarde par si par la des tutos sur la migration, et je vois un peu comment ca marche mais mon projet futur aura plus d une 20 tables et j ai deja le sql oracle donc j aimerai connaitre le reel interet de creer la base avec la migration plustot que de la rapatrier avec elle?
sachant que de toute facon pour chaque table je vais creer une class dans le modele avec les cardinalite has_many, belongs????
esox_ch... pas taper  ;) prend en compte que je debute vraiment donc faut vraiment me parler simplement et ce qui est evident pour toi ne l est pas du tout pour moi :)
encore MERCI de votre aide  :jap:


Message édité par schum-hacker le 08-01-2009 à 08:42:19
Reply

Marsh Posté le 08-01-2009 à 08:45:53    

Salut,
Donc pourquoi utiliser les migrations ?  
- Parce que ça t'évite de devoir écrire des pages de SQL  
- Parce que lors ce que tu déploies ton site avec Capistrano (l'outil de déploiement) il s'en occupe pour toi.
- Parce que ça rend ton script portable (mes fichiers de migration, que j'utilise avec MySQL, marcheront chez toi, parce que rails les "traduit" en Oracle)
- Parce que ça te permet d'utiliser le plugin dont je parlais plus haut, ce qui t'évitera de faire ce genre d'erreur et te permettra donc d'utiliser le bout de code que je t'ai écrit


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 08-01-2009 à 08:52:22    

en gros c'est pour la portabilité et pour pas etre embetter a cause de nom des foreign key entre autre?
le pb c'est qu on a utilisé dbdesigner qui a géneré l'integralité du code sql oracle donc j ai déja le sql
mais je vais donc faire comme tu m as dit et je vais essayer de le générer via la migration ;)

Reply

Marsh Posté le 08-01-2009 à 09:00:48    

Tu peux garder tes fichiers SQL si vraiment t'en as envie, mais c'est un peu con parce que c'est beaucoup plus simple avec les migrations..
 
Si t'as d'autres problèmes, n'hésite pas.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 08-01-2009 à 14:11:41    

Pour ma part, capistrano = beurk. Voir mon post dans le topic blabla@rails ;)
 
Sinon les migrations c'est génial.

Reply

Marsh Posté le 08-01-2009 à 14:19:18    

Capistrano a du bon, selon moi, si tu as l'impératif d'avoir plusieurs serveur tournant sur exactement la même chose. Dans ce cas c'est effectivement très pratique parce que t'es sur que tout est "bien fait" sur tous les serveurs.
 
Cependant, si tu dois garder à jour 1 seul serveur, là je trouve que ça vaut pas la peine


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 08-01-2009 à 17:11:45    

esox_ch a écrit :


Igarimasho > Pas besoin de join ou include dans ce cas. S'il définit comme il faut les foreign keys dans son fichier de migration et que le modèle est bien configuré (là ça semble correcte), Rails écrira directement la bonne requête quand il appellera le bout de code que j'ai écrit... C'est assez cool parce que une fois que tu as défini les relations entre tes tables, tu te casses plus la tête à savoir ce que tu dois joindre avec quoi, rails s'en occupe..


J'ai commencé à recoder une partie de mes modèles pour en tirer parti, et ça marche super bien  :hello:

Reply

Marsh Posté le 08-01-2009 à 17:24:05    

Tes modèles? Moi c'est dans mes controlleurs que j'utilise ça surtout :heink:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 08-01-2009 à 17:55:30    

Disons que dans mes modèles je créais des custom find avec des :joins histoire de pas saloper mes controlleurs avec trop de code (fat model skinny controller), là du coup j'ai viré ces méthodes j'appelle @article.comments dans mon controlleur (skinny model and skinny controller) :jap:

Reply

Marsh Posté le 08-01-2009 à 18:01:00    

D'accord :bounce:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 09-01-2009 à 14:38:16    

Code :
  1. <%=h livre.emprunt.usager.nom %>


 
:bounce:
 
Faut bien comprendre ce que t'es en train de faire ... Tu as dit à ActionRecord que Livre possède 1 attribut Emprunt. Donc quand tu tapes livre.emprunt, il va regarder la foreign key nommée emprunt_id dans livre et va te retourner l'emprunt correspondant. Après toi tu veux avoir l'usager correspondant? Bein ça continue de la même manière :o
 
Edit: Typo


Message édité par esox_ch le 09-01-2009 à 14:38:51

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 09-01-2009 à 14:43:33    

ah lol je venais de trouver lol MERKI qd meme c sympa t as été trop rapide ;)

Reply

Marsh Posté le 09-01-2009 à 15:37:31    

Reply

Marsh Posté le 09-01-2009 à 15:39:09    


 
Plait-il ? T'as éternué un peu fort? :heink:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed