Associations dynamiques ?

Associations dynamiques ? - Ruby/Rails - Programmation

Marsh Posté le 13-02-2012 à 09:33:51    

Salut,
 
Je débute en Ruby/Rails et je voudrais faire qqch de "spécial".
 
J'ai 2 classes :
Lesson (table Lessons) et Person (table people)
 
Un "lesson" à un lien "teacher" sur person. Elle a aussi un lien "students" sur person.
 
Jusque là, pas de soucis. J'arrive a afficher ma liste d'étudiant et mon prof pour un cours.  
 
La lesson a aussi une date.
 
Ce que j'aimerai faire maintenant, c'est afficher toutes les lessons pour un range de date pour un étudiant. Une idée comment faire ? Genre en gros, afficher toutes les lessons pour l'année passée pour une personne
 

Code :
  1. class Lesson < ActiveRecord::Base
  2.         has_and_belongs_to_many :people
  3.         belongs_to :teacher, :class_name => "Person", :foreign_key => "person_id"
  4. end
  5. class Person < ActiveRecord::Base
  6.         has_and_belongs_to_many :lessons
  7. end

Reply

Marsh Posté le 13-02-2012 à 09:33:51   

Reply

Marsh Posté le 15-02-2012 à 15:07:23    

Salut,
 
le plus simple pour faire ça, c'est d'utiliser un scope.
 
Dans la définition de ton model, en imaginant que le champs date s'appelle occurs_on :

Code :
  1. class Lesson < ActiveRecord::Base
  2.         has_and_belongs_to_many :people
  3.         belongs_to :teacher, :class_name => "Person", :foreign_key => "person_id"
  4.         scope :before_current_year, lambda { where(' occurs_on < "'+ Time.now.year.to_s + '-01-01" ') }
  5. end


Comme le précise la doc, on utilise lambda car il y a une évaluation à faire  
http://guides.rubyonrails.org/acti [...] tml#scopes
 
Puis tu peux l'utiliser dans ton controlleur :

Code :
  1. p = Person.find(1)
  2. @olddates = p.lessons.before_current_year


Message édité par bobmaerten le 15-02-2012 à 15:10:17
Reply

Marsh Posté le 15-02-2012 à 15:19:51    

cool merci je vais essayer. Je ne connaissais pas les scopes.

Reply

Sujets relatifs:

Leave a Replay

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