Одним из решений может быть добавление counter_cache для групп.
В Group.rb
belongs_to :page, :counter_cache => true
Затем необходимо создать миграцию
def self.up
add_column :pages, :groups_count, :integer, :default => 0
Page.reset_column_information
Page.find(:all).each do |p|
Page.update_counters p.id, :groups_count => p.groups.length
end
end
def self.down
remove_column :pages, :groups_count
end
Итак, теперь вы можете сделать:
Page.first(:conditions => { :groups_count => 0 })