ruby-on-rails – 类型转换ActiveRecord模型虚拟属性

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 类型转换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

但是我觉得这样做很脏.有没有更好的替代方法,而不重写转换方法

谢谢

解决方法

原始帖子的解决方案看起来像是我最好的解决方案.
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 …

猜你在找的Ruby相关文章