gpt4 book ai didi

ruby-on-rails - 对 ActiveRecord 模型虚拟属性进行类型转换

转载 作者:行者123 更新时间:2023-12-02 02:44:14 25 4
gpt4 key购买 nike

我有一个具有一些属性和虚拟属性的模型。该虚拟属性用于在创建表单中制作复选框。

class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
end

由于该字段是表单中的复选框,因此 foo 属性将接收 '0''1' 作为值。由于以下代码,我希望它是一个 bool 值:

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',条件也将为 true。我想使用 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)属性。每当您有从表单提交的 bool 虚拟属性时,这种类型转换都是必不可少的。

也许我们应该向 Rails 提交补丁...

关于ruby-on-rails - 对 ActiveRecord 模型虚拟属性进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com