Web scraper for job listings
Here are some comments.
- If you are only @page as a way to communicate with scarpe_single_page, why not make it a parameter?

def scrape_duty_station
    agent = Mechanize.new  
    page = agent.get(web_link)


Avoid extra indent when one of the cases is simpler and can be dealt with easily.

Also, about your ranges. They should really be named constants.

    return scrape_single_page(page.links[5...30]) unless page.links[5].text =~ /^next/i
    arr = [page] + (l_i(page,5)..l_i(page,6)).collect{|i|agent.get(web_link+"/#{i}")}
    arr.each {|p| scrape_single_page p.links[7...31] }
  end


If you are using any statement more than once, it may be worthwhile to facter it out to a function.

  def l_i(page, link)
    page.links[link].href.match(/\d+/).to_s.to_i
  end


Does position have a constructor? If not, it would be nice to create one for it. If yes, it would be better to use it.

  def scrape_single_page(pages)
    pages.each do |p|
      Position.new(p.text,p.href,p.href.match(/\d+/).to_s,
            Station.where(:web_link =&gt; self.web_link).first).save
    end
  end