我有一个User
,其String
email
属性。但是,当我在我的应用程序中处理电子邮件时,我发现首先将其转换为(非持久的)Email
对象是可取的,如下所示:
class User < ActiveRecord::Base
def email
Email.new(self.read_attribute :email)
end
end
Email#to_s
和Email#to_str
都被定义为原始字符串(例如foo@bar.com
),因此对于客户来说,无论他们是否正在处理{{{ 1}}或Email
。
在使用String
分配属性时,这非常有效:
ActiveRecord
ActiveRecord知道> email = Email.new('foo@bar.com')
> user.email = email
属性是一个字符串,并相应地转换email
对象。有点令人费解的是,在查询数据库时它不会这样做:
Email
显然,我可以致电
> email = Email.new('foo@bar.com')
> User.find_by email: email
ActiveRecord::StatementInvalid: can't cast Email to string
但有没有办法让这个演员自动发生?
答案 0 :(得分:4)
This is the responsible object用于将对象转换为ActiveModel中的字符串。请查看那里的serialize方法:它没有处理Email
的案例。
您可以通过扩展课程来添加一个:
module EmailSupport
def serialize(value)
case value
when Email then value.to_s
else super
end
end
end
ActiveModel::Type::ImmutableString.include(EmailSupport)
User.find_by email: Email.new('foo@example.org')
答案 1 :(得分:0)
您可以覆盖模型中的getter方法来强制转换并返回字符串。