You can also use Ruby's [Matrix class](http://www.ruby-doc.org/stdlib-2.1.1/libdoc/matrix/rdoc/Matrix.html) to see if player `p` wins. In the following, `square[i][j]` is the player in row `i`, column `j`.  

**Code**

    require 'matrix'
       
    def win?(square,p)
      n = square.size
      m = Matrix[*square]
      pvec = Matrix.build(1,n){p}.row(0)
      m.row_vectors.any?    { |r| r == pvec }                ||
        m.column_vectors.any? { |c| c == pvec }              ||
        Matrix.rows([m.each(:diagonal).to_a]).row(0) == pvec ||
        n.times.all? { |i| square[i][n-i-1] == p }
    end

**Example**

    square = [[1,3,2],
              [4,2,6],
              [2,8,9]]

    win?(square, 2)                    #=> true
    win?([[1,3,2],[4,3,6],[2,3,9]], 3) #=> true
    win?([[1,3,2],[3,3,3],[2,7,9]], 3) #=> true
    win?([[1,3,2],[4,5,6],[7,8,9]], 1) #=> false

**Explanation**

    pvec = Matrix.build(1,n){p}.row(0)

creates a vector for which every element is the value of the player argument `p` (e.g., `pvec # => Vector[2,2,2]`).

    m.row_vectors.any? { |r| r == pvec }

determines if player `p` wins in any row,

    m.column_vectors.any? { |c| c == pvec }

determines if player `p` wins in any column,

    Matrix.rows([m.each(:diagonal).to_a]).row(0) == pvec

determines if player `p` wins on the main diagonal, and

    (0...n).all? { |i| square[i][n-i-1] == p }

determines if player `p` wins on the minor diagonal (top right to bottom left).

I was unable to find a way to check the minor diagonal using `Matrix` class methods.