2010-09-23 61 views
0

用戶應該插入所有值,可以是正值或負值。所有值相同符號驗證

我該如何設置相同的符號驗證?

對的,我寫了這對before_save ..

unless (self.alt_1 >= 0 && self.alt_2 >=0 && self.alt_3 >= 0 && 
     self.alt_4 >= 0 && self.alt_5 >= 0 && self.alt_6 >= 0) || 
    (self.alt_1 <= 0 && self.alt_2 <=0 && self.alt_3 <= 0 && 
     self.alt_4 <= 0 && self.alt_5 <= 0 && self.alt_6 <= 0) 
    self.errors.add_to_base(_("All values sign should be same.")) 
end 
+0

我想你應該在這裏添加一些細節。您是否試圖驗證單個請求中輸入的所有值或模型的所有實例上的值或模型的同一實例上的所有值? – Shadwell 2010-09-23 14:20:19

+0

@Shadwell我修改了我的問題。 – 2010-09-23 14:30:27

回答

3
first_sign = self.alt_1 <=> 0 

(2..6).each do |n| 
    unless (self.send("alt_#{n}") <=> 0) == first_sign 
    errors.add_to_base(_("All values' signs should be same.")) 
    break 
    end 
end 

通過這種方法,我們首先得到alt_1的符號,然後看看是否元素的其餘部分(alt_2通過alt_6的跡象) 比賽。只要我們發現一個不匹配,我們添加驗證錯誤並停止。它最多6次迭代和最小的2.


另一個更巧妙,但效率較低方法將運行,是使用便利的方法Enumerable#all?,如果塊傳遞給它返回一個返回true適用於所有的元素:

range = 1..6 

errors.add_to_base(_("All values' signs should be same.")) unless 
    range.all? {|n| self.send("alt_#{n}") >= 0 } || 
    range.all? {|n| self.send("alt_#{n}") <= 0 } 

在這裏,我們首先檢查是否所有的元素都大於0,然後,如果所有的元件都小於0。此方法的最大的12倍和最少6迭代。

+0

由於self.send'調用符號'和alt_1標識的方法似乎是一個變量我不知道這應該如何工作。 – 2010-09-23 15:49:03

+0

發送也接受一個字符串,alt_1是一個自我的方法。 – 2010-09-23 15:50:34

0
unless 
    [:<=, :>=].any? do |check| 
    # Check either <= or >= for all values 
    [self.alt1, self.alt2, self.alt3, self.alt4, self.alt5, self.alt6].all? do |v| 
     v.send(check, 0) 
    end 
    end 
    self.errors.add_to_base(_("All values sign should be same.")) 
end 
+0

我考慮過類似的解決方案,因爲它更幹,但我認爲它犧牲了可讀性的聰明。 – 2010-09-23 15:57:05

1

這裏有一個稍微不同的方式對你:

irb(main):020:0> def all_same_sign?(ary) 
irb(main):021:1> ary.map { |x| x <=> 0 }.each_cons(2).all? { |x| x[0] == x[1] } 
irb(main):022:1> end 
=> nil 
irb(main):023:0> all_same_sign? [1,2,3] 
=> true 
irb(main):024:0> all_same_sign? [1,2,0] 
=> false 
irb(main):025:0> all_same_sign? [-1, -5] 
=> true 

我們使用the spaceship operator獲得每個號碼的跡象,我們確保每一個元素具有相同的符號如下它的元素。你也可以把它改寫成更懶的做

​​3210

但這在我看來不太可讀。

相關問題