ActiveRecord - 检查value是否为null,0或1

时间:2012-08-05 05:40:23

标签: ruby-on-rails ruby activerecord

Rails 3.2.2, Ruby 1.9.2

我正在使用MySql,并且有TINYINT类型的列“MyColumn”。我需要在页面上显示它的状态。所以我创建了一个辅助方法。

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,即使它应该这样做。 我做错了什么?

1 个答案:

答案 0 :(得分:4)

case使用===进行比较,因此相当于:

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

Rails向looks like this

的对象添加blank?方法
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