【问题标题】:Ruby: Active Record: Boolean accept value , why 'y' and 'yes' cannot?Ruby:Active Record:布尔接受值,为什么'y'和'yes'不能?
【发布时间】:2014-04-16 04:09:56
【问题描述】:
我有一个使用 rails 4.1 的 rails 模型,其中一个字段是布尔类型。我想使用“y”或“yes”来更改布尔值,但它不起作用。它只允许't','on',true。
我的数据库是 postrgresql
2.1.1 :031 > a.default_indicator = 'y'
=> "y"
2.1.1 :032 > a.default_indicator
=> false
2.1.1 :033 > a.default_indicator = 'yes'
=> "yes"
2.1.1 :034 > a.default_indicator
=> false
2.1.1 :035 > a.default_indicator = 'true'
=> "true"
有人知道为什么吗?
【问题讨论】:
标签:
ruby-on-rails
ruby
activerecord
【解决方案1】:
您会在 ActiveRecord::ConnectionAdapters::Column 中找到一些常量,当 Rails 需要将数据库字段中的值类型转换为模型属性时会使用这些常量:
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON'].to_set
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE', 'off', 'OFF'].to_set
# convert something to a boolean
def value_to_boolean(value)
if value.is_a?(String) && value.blank?
nil
else
TRUE_VALUES.include?(value)
end
end
【解决方案2】:
您可以在您的模型中将其作为方法检查并相应地保存数据库。
例如。
class MyEntity < ActiveRecord::Base
def active
return false unless active=='y'|| active == 'yes'
true
end
end
上述方法将返回 True 或 false。您可以通过此方法保存数据。