Self-referential model breaks `#ancestors` method.
rockwellll opened this issue · 1 comments
Hello. Hoping you're having a good day. So, i've a setup that looks like this
class Step
has_closure_tree
belongs_to :root_step, class_name: "Step", foreign_key: :root_step_id, optional: true
has_many :versions, class_name: "Step", foreign_key: :root_step_id
endWe have a requirement that states A step must either belong to a root step. or root step is itself. According to that, what i'm doing is
after_create do
update root_step_id: self.id unless root_step_id.present?
endI am setting the root_step_id of a step to itself.
When doing so. It breaks the ancestry method. It always return nil. However, i can call #parent method, i.e ste.parent.parent and all works fine. But if i want to access the step's ancestors it will always return me nil.
3.1.0 :006 > step2.parent
=>
#<Step:0x000000010c8d5f38
id: 306,
parent_id: nil,
root_step_id: 306> However, doing step2.parent will always return me nil.
3.1.0 :007 > step2.ancestors
Step Load (0.7ms) SELECT "steps".* FROM "steps" INNER JOIN "step_hierarchies" ON "steps"."id" = "step_hierarchies"."ancestor_id" WHERE "step_hierarchies"."descendant_id" = $1 AND ("steps"."id" != 307) ORDER BY "step_hierarchies".generations ASC [["descendant_id", 307]]
=> [] Why calling #ancestors returns nil?. I think for some reason the self-referential reference to itself is causing that. Because when i removed it everything works fine.
Thanks
It something related to your code. I could not reproduce it. If you provide a demo repo, i can look at it.