カスタムバリデーション作るか、
条件付きvalidation使ってるね

サクッとやれるのは条件付きvalidationかも

4つ必要になる。

attr :xxx

validate :xxx, presence: true, unless: valid_input_cols?, message: 'col1,2,3はいずれか1つだけ入力が必要です'
validate :col1, numericality: true, if: (self.col1.preset? and valid_input_cols?)
validate :col2, numericality: true, if: (self.col2.preset? and valid_input_cols?)
validate :col3, numericality: true, if: (self.col3.preset? and valid_input_cols?)

def valid_input_cols?
count = 0
count = count + 1 if self.col1.preset?
count = count + 1 if self.col2.preset?
count = count + 1 if self.col3.preset?
count == 1 ? true : false
end

xxxはvalidationの便宜のために作った適当な仮想属性。col1とか使っても別にいいっちゃいい。
コードは適当なのでそのままでは動かんかも
あんまスマートなやり方でないので、他の人のやり方を知りたい