加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:28:15 所属栏目:百科 来源:网络整理
导读:我有一个模型有一些属性和一个虚拟属性. 该虚拟属性用于在创建表单中创建一个复选框. class Thing ActiveRecord::Base attr_accessor :foo attr_accessible :fooend 由于该字段是窗体中的复选框,因此foo属性将接收“0”或“1”作为值.由于以下代码,我希望它
我有一个模型有一些属性和一个虚拟属性.
该虚拟属性用于在创建表单中创建一个复选框.
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 …

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读