2012-08-05 71 views
0
Rails 3.2.2, Ruby 1.9.2 

我正在使用MySql,并且存在TINYINT类型的“MyColumn”列。我需要在页面上显示它的状态。所以我创建了一个辅助方法。ActiveRecord - 检查值是否为null,0或1

module MyControllerHelper 
def result(a) 
    case a 
     when false then 'false 0' 
     when true then 'true 1' 
     when blank? then 'blank or nil' 
    end  
    end 
end 

底线是它也可以是空的或零。所以它不起作用,因为我需要。它不断返回false 0true 1,但从不返回blank or nil,即使它应该这样做。 我做错了什么?

回答

4

一个case使用===进行比较,这样的等价于:

if false === a 
    'false 0' 
elsif true === a 
    'true 1' 
elsif blank? === a 
    'blank or nil' 
else 
    nil 
end 

Rails添加一个blank?方法,对象是looks like this

def blank? 
    respond_to?(:empty?) ? empty? : !self 
end 

,所以你可以调用blank?任何地方,即使没有指定接收器:总是会有一个self,它将永远是一个对象。现在您应该看到when blank?虽然在语法上有效,但完全没有意义:它不会调用a.blank?并查看是否有真值返回,它仅检查self.blank? === a是否适合self

你可能会更好过使用一个明确的if/else此:

def result(a) 
    # false.blank? is true so you don't want a.blank? here. 
    if(a.nil?) 
    'nil' 
    elsif(a) 
    'true 1' 
    else 
    'false 0' 
    end 
end