如何将对象转换为字符串以用于ActiveRecord查询?

时间:2017-02-11 23:41:25

标签: ruby-on-rails ruby activerecord

我有一个User,其String email属性。但是,当我在我的应用程序中处理电子邮件时,我发现首先将其转换为(非持久的)Email对象是可取的,如下所示:

class User < ActiveRecord::Base
  def email
    Email.new(self.read_attribute :email)
  end
end

Email#to_sEmail#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

但有没有办法让这个演员自动发生?

2 个答案:

答案 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方法来强制转换并返回字符串。