Awesome nested set; parent_id

Bonjour,

Je débute en rails, et j’ai un petit souci pour lequel je ne vois pas
bien de solution.

J’ai un “model” nommé “Groupe”.
Il a une relation de type has_many vers un autre modèle (aucun pb)
il a une relation auto-référente que je gère avec un
acts_as_nested_set (awesome_nested_set). C’est bien là qu’intervient
mon pb:

Lorsque dans mon formulaire je créer un nouveau groupe, tout se passe
bien sauf lorsque je lui spécifie un parent (parent_id). Là le log me
sort un “Warning: can’t mass-assign”… Après quelques recherches,
j’ai compris l’origine et l’intérêt d’un telle protection, je ne vois
pas comment associer à la création de mon objet un parent.

Si qqun à une piste, je suis preneur

PS: Dans mon modèle lorsque je mets “attr_accessible”, rails hurle en
me disant qu’un attibut ne peut pas être à la fois protégé et
accessible… Du coup j’ai jeté un coup d’oeil dans plugin et tenté de
le modifier pour enlever le protected à mon “parent_id”, mais rien
n’y fait…

Bonjour,

tous les “*_nested_set” rangent tes enregistrements dans la BDD avec des
champs “lft” et “rgt”, une astuce qui permet de simuler un rangement
arborescent : la théorie est intéressante et étonnamment simple, tu as
les dessins et le texte sur awesome, better ou sur le plugin original.

Changer directement le parent_id “casserait” ces astuces de calcul,
c’est pour ça que c’est interdit. Il faut donc utiliser les méthodes
d’awesome pour déplacer/insérer un objet dans l’arbre, typiquement
“move_to_*”. Et donc supprimer parent_id de tes params,

Ça te donne donc un code en deux étapes qui ressemble à :
@obj.move_to_child_of(params[:obj].delete[:parent_id])
@obj.update_attributes(params[:obj])

Ajoute tout le code de gestion et de sécurité que tu veux :slight_smile:

Attention : “bouger” le noeud re-sauve l’objet dans la BDD. C’est
important à noter si tu as des triggers etc.

Bon courage,

Bonjour,

Le 5 déc. 09 à 15:39, rmb a écrit :

pas comment associer à la création de mon objet un parent.

Si qqun à une piste, je suis preneur

PS: Dans mon modèle lorsque je mets “attr_accessible”, rails hurle en
me disant qu’un attibut ne peut pas être à la fois protégé et
accessible… Du coup j’ai jeté un coup d’oeil dans plugin et tenté de
le modifier pour enlever le protected à mon “parent_id”, mais rien
n’y fait…

Le principe de nested set est de numéroter les feuilles de l’arbre.
Si on met directement un parent_id, on ne décale pas les numéros et
l’arbre est inexploitable. Il faut donc toujours d’abord créer (à la
fin de l’arbre) puis déplacer (et assigner un parent).
Si ces deux opérations doivent absolument être groupées, penser à une
transaction ?

Jean-Christophe M.

Ok, Merci

J’ai bien compris le principe, je vais essayer de me débrouiller avec
ça.