Skip to content

Instantly share code, notes, and snippets.

@equivalent
Last active October 29, 2018 07:47
Show Gist options
  • Save equivalent/5063770 to your computer and use it in GitHub Desktop.
Save equivalent/5063770 to your computer and use it in GitHub Desktop.
Recursion example in Ruby on Rails model. Recursion will generate array of parents parents
class Document < ActiveRecord::Base
belongs_to :parent, class_name: 'Document'
def self.get_ancestors(who)
@tree ||= []
# @tree is instance variable of Document class object not document instance object
# so: Document.get_instance_variable('@tree')
if who.parent.nil?
return @tree
else
@tree << who.parent
get_ancestors(who.parent)
end
end
def ancestors
@ancestors ||= Document.get_ancestors(self)
end
end
# Recursion will generate array of parents parents
d = Document.last
d.ancestors.collect(&:id)
# => [570, 569, 568]
class CreateDocuments < ActiveRecord::Migration
def change
create_table :documents do |t|
t.integer :parent_id
t.string :file
t.timestamps
end
end
end
@douxsey
Copy link

douxsey commented Sep 4, 2018

this worked for me

  def parents_id
    parents = []
    if parent
      parents << parent.id
      (parents << parent.parents).flatten
    else
      parents.flatten
    end
  end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment