Я согласен с предложением @ abdollar об использовании acts_as_tree. Или вы можете просто создать ассоциацию для одной и той же таблицы (что именно делает поступок act_as_tree).
Если вы хотите применить свои собственные методы, приведенные в качестве примеров, вы можете создать модуль в lib, который вам может потребоваться, и включить в свои модели ...
# lib/children.rb
module Children
def children
self.class.where(:parent_id => self.id)
end
def children?
children.present?
end
end
# app/models/subject.rb (or any other model)
require 'children'
class Subject < ActiveRecord::Base
include Children
end
Если вы используете rails 2, вам не нужно делать require 'children'
, так как lib загружается автоматически. Если вы используете rails 3, вы можете поместить это в инициализатор или что-нибудь, чтобы очистить его.