我有一个模型具有一些属性和虚拟属性。 此虚拟属性用于在创建表单中创建复选框。类型投下ActiveRecord模型虚拟属性
class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
end
由于场是在形式的复选框时,foo
属性将接收'0'
或'1'
作为值。我想这是因为下面的代码一个布尔值:
class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
before_validation :set_default_bar
private
def set_default_bar
self.bar = 'Hello' if foo
end
end
的问题在这里是,即使foo
是'0'
病情会是真的。我想用我发现这样做是以下ActiveRecord的类型转换机制,但唯一的:
class Thing < ActiveRecord::Base
attr_reader :foo
attr_accessible :foo
before_validation :set_default_bar
def foo=(value)
@foo = ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
end
private
def set_default_bar
self.bar = 'Hello' if foo
end
end
但我觉得脏做它的方式。没有重写转换方法,是否有更好的选择?
感谢
由于值可能会更改为“true”和“false”,它仍然应该工作。轨道没关系,但在错误的地方恕我直言。 – Happynoff 2012-07-19 13:19:25
关于在'foo ='中设置@bar我认为这不是做它的地方,单一责任原则和所有。而且,在我真正的用例中,将它放在before_validation中是有意义的;) – Happynoff 2012-07-19 13:24:25
你说得对。你有这个解决方案:https://gist.github.com/2000623但我不认为这是一个更好的解决方案。它基本上与轨道相同。查看源代码:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/column.rb – Dougui 2012-07-19 13:28:32