I like that you've made this method generic since the logic is the same for rows, columns, and subgrids. I think you could push a bit further in removing the duplication though, since the `check_rows`, `check_columns`, and `check_subgrids` methods are all essentially the same. Perhaps `valid_rows_columns_grids` could be changed to something like the below:

```ruby
def valid_rows_columns_grids
  [board.rows, board.columns, board.subgrids].none? |set|
    set.none? do |elements|
      check_for_duplicates(elements)
    end
  end
end
```

The inner `none?` block could probably be extracted to a small private method as well afterwards.