Disclaimer: désolé de mon français, qui n'est pas trop bon

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

collection<<(object, …)
Adds one or more objects to the collection by setting their foreign keys to
the collection's primary key. Note that this operation instantly fires
update SQL without waiting for the save or update call on the parent
object, unless the parent object is a new record.

si tu veux pas garder l'event dans ta base de données, tu peux changer

    x = Event.new(:name => "majeur", :date => e.date + 18.years)
    events << x

par

    events.build(:name => "majeur", :date => e.date + 18.years)

(il faut pas faire events = self.events)

J'espère que vous pourrez comprendre :D


2014-09-01 23:02 GMT+02:00 Guillaume Betous <guillaume.bet...@gmail.com>:

> Bonjour,
>
> Une question qui se pourrait être purement Ruby en fait, mais je soupçonne
> quand même Rails de trafiquer dans mon dos :)
>
> J'ai des histoires (stories) dans lesquelles on peut enregistrer des
> événements (events). Ce sont des ressources imbriquées classique (story
> has_many events).
>
> A l'affichage d'une story (methode 'show') je liste les événements créés,
> mais je veux en afficher d'autres, automatiquement générés.
>
> Exemple d'affichage d'une histoire que je cherche :
>
> * naissance (05/12/2000)    <= c'est un événement qui a été enregistré par
> l'utilisateur
> * entrée école (01/09/2005) <= c'est un autre événement qui a été
> enregistré par l'utilisateur
> * majeur (05/12/2018)      <= celui-là, c'est le modèle "story" qui le
> crée à la volée, parce que on sait bien que à 18 ans il sera majeur
>
> Voici le code que j'ai fait.
>
> Dans le story_controler :
>
> def show
>   @events = @story.compute_events
> end
>
> Dans le modèle :
>
> def compute_events
>   events = self.events
>   events.each do |e|
>     if e.name == "naissance"
>       x = Event.new(:name => "majeur", :date => e.date + 18.years)
>       events << x
>     end
>   end
>   return events
> end
>
> Mon soucis c'est que ça marche... trop ! En effet, cela me crée dans la
> base l'event correspondant (il a bien un nouvel id, et a bien la clée
> étrangère de ma story). En reloadant ma page de "show", je vois de nouveaux
> events arriver.
>
> * naissance (05/12/2000)
> * entrée école (01/09/2005)
> * majeur (05/12/2018)
> * majeur (05/12/2018)
> * majeur (05/12/2018)
> * majeur (05/12/2018)
> * majeur (05/12/2018)
> * etc...
>
> Bref :
> 1 - Comment se fait-il ?
> 2 - Comment dois-je faire ?
>
> Merci !
>
> gUI
>
> --
> Pour la santé de votre ordinateur, préférez les logiciels libres.
> Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
> Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
> Suite bureautique : http://www.libreoffice.org/download/
>
> --
> --
> Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de
> Google Groups.
> Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
> railsfrance@googlegroups.com
> Pour résilier votre abonnement envoyez un e-mail à l'adresse
> railsfrance-unsubscr...@googlegroups.com
> ---
> Vous recevez ce message, car vous êtes abonné au groupe Google Groupes
> "Railsfrance".
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse
> railsfrance+unsubscr...@googlegroups.com.
> Pour obtenir davantage d'options, consultez la page
> https://groups.google.com/d/optout.
>

-- 
-- 
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
railsfrance@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
railsfrance-unsubscr...@googlegroups.com
--- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes 
Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, 
envoyez un e-mail à l'adresse railsfrance+unsubscr...@googlegroups.com.
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Répondre à