URL: https://linuxfr.org/forums/programmation-ruby/posts/rails-probl%C3%A8me-stack-level-too-deep-et-relation-r%C3%A9cursive Title: [Rails] Problème stack level too deep et relation récursive. Authors: totof2000 Date: 2010年04月02日T14:45:05+02:00 Tags: Score: 0 Bonjour à tous. Contexte : je veux modéliser des bus de connection entre périphériques externes. Je crée pour celà une table Buses : class CreateBuses < ActiveRecord::Migration £spaces£ £/spaces£def self.up £spaces£ £/spaces£create_table :buses do |t| £spaces£ £/spaces£t.column :name, :string £spaces£ £/spaces£t.column :version, :string £spaces£ £/spaces£t.column :speed, :integer £spaces£ £/spaces£end £spaces£ £/spaces£end £spaces£ £/spaces£def self.down £spaces£ £/spaces£drop_table :buses £spaces£ £/spaces£end end Je veux pouvoir gérer la compatibilité entre les divers bus: par exemple je suppose qu'un bus SCSI1 est compatible avec un bus SCSI2. Je dois donc gérer une relation récursive sur ma table (un bus peut être compatible avec plusieurs autres bus) Cependant, lorsque j'ajoute un bus d'un certain type dans ma liste de compatibilité, il faut que la réciproque soit vraie (exemple : un bus SCSI2 est compatible avec SCSI1, et vice-versa. Notez que je ne parle pas de format de connecteur, je parle juste en terme de bus). Autrement dit, lorsque j'ajoute scsi2 à la liste des bus compatibles avec scsi1, je ne dois pas ajouter scsi1 à la liste des bus compatibles à SCSI2, c'est censé se faire tout seul. Dans un premier temps, pour gérer la relation, j'ai créé une table buses_compatibles de la façon suivante : class CreateBusesCompatibles < ActiveRecord::Migration £spaces£ £/spaces£def self.up £spaces£ £/spaces£create_table :buses_compatibles do |t| £spaces£ £/spaces£t.column :bus_id, :integer £spaces£ £/spaces£t.column :compatible_id, :integer £spaces£ £/spaces£end £spaces£ £/spaces£end £spaces£ £/spaces£def self.down £spaces£ £/spaces£drop_table :buses_compatibles £spaces£ £/spaces£end end Puis je modifie mon modèle ainsi: class Bus < ActiveRecord::Base £spaces£ £/spaces£has_many :idiskslotmodels £spaces£ £/spaces£ £spaces£ £/spaces£has_and_belongs_to_many :compatibles, £spaces£ £/spaces£:class_name=> "Bus", £spaces£ £/spaces£:join_table => "buses_compatibles", £spaces£ £/spaces£:association_foreign_key =>"compatible_id", £spaces£ £/spaces£:foreign_key => "bus_id", £spaces£ £/spaces£:after_add => :be_compatibly_to_compatible, £spaces£ £/spaces£:after_remove => :no_more_compatible £spaces£ £/spaces£ £spaces£ £/spaces£def be_compatibly_to_compatible(compatible) £spaces£ £/spaces£compatible.compatibles << self unless compatible.compatibles.include?(self) £spaces£ £/spaces£end £spaces£ £/spaces£def no_more_compatible(compatible) £spaces£ £/spaces£compatible.compatibles.delete(self) rescue nil £spaces£ £/spaces£ £spaces£ £/spaces£end end Lorsque je crée un bus, et que j'ajoute des autres bus dans la liste des bus compatibles, ça se passe bien, mais c'est lorsque je sauve que j'ai un problème. J'ai l'impression que les bus demandent aux bus compatibles de se sauvegarder, et les bus compatibles font la même chose donc rappellent le bus "originel" qui lui rappelle la méthode de sauvegarde du bus compatible, etc ... et ce infiniment. Ci-dessous un exemple : Loading development environment.>> b1=Bus.new => #nil, "version"=>nil, "speed"=>nil}> >> b2=Bus.new => #nil, "version"=>nil, "speed"=>nil}> >> b2.compatibles< [#nil, "version"=>nil, "speed"=>nil}>], @new_record=t rue, @attributes={"name"=>nil, "version"=>nil, "speed"=>nil}>] >> b1.save SystemStackError: stack level too deep [... ] Voyez-vous un moyen d'empêcher ça ? Merci d'avance pour votre aide.

AltStyle によって変換されたページ (->オリジナル) /