我有一个模型有一些属性和一个虚拟属性.
该虚拟属性用于在创建表单中创建一个复选框.
该虚拟属性用于在创建表单中创建一个复选框.
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
但是我觉得这样做很脏.有没有更好的替代方法,而不重写转换方法?
谢谢
解决方法
原始帖子的解决方案看起来像是我最好的解决方案.
class Thing < ActiveRecord::Base attr_reader :foo def foo=(value) @foo = ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value) end end
如果你想清理一些东西,你可以随时创建一个帮助方法,它使用value_to_boolean来定义你的foo = writer方法.
我可能会使用一个名为bool_attr_accessor的方法来创建一个模块,以便您可以简化模型,使其如下所示:
class Thing < ActiveRecord::Base bool_attr_accessor :foo end
ActiveModel似乎应该为我们提供这样的东西,使虚拟属性更像“真实”(ActiveRecord-persisted)属性.只要您有一个从表单提交的布尔虚拟属性,此类型转换就是必不可少的.
也许我们应该提交一个补丁到Rails …