【发布时间】:2014-04-11 14:54:53
【问题描述】:
我刚开始在 Rails 4 中试验原生 Postgres 数组类型,但遇到了一个我无法弄清楚的问题。如果数组属性的值不是数组,我希望应用程序引发错误。
之前,当我对字段使用常规文本类型并使用 Rails 对其进行序列化时,我能够确保该属性是一个具有如下自定义验证的数组:
def format_of_admin_email
regexp = /.+@.+\..+/i
if admin_emails.present? &&
(!admin_emails.is_a?(Array) || admin_emails.detect { |a| a.match(regexp).nil? })
errors[:base] << "admin_emails must be an array of valid email addresses"
end
end
但是现在该字段是 Postgres 数组,看起来 Rails 会自动将字符串输入转换为空数组,因此验证永远不会失败。这是我的迁移:
class AddAdminEmailsToLocations < ActiveRecord::Migration
def change
add_column :locations, :admin_emails, :text, array: true
end
end
如果我创建一个 admin_emails 是字符串的位置:
Location.create!(admin_emails: "this should fail")
它不会引发验证错误,它会将 admin_emails 设置为一个空数组。
是我做错了什么还是 Rails 中的错误?
我还尝试在 before_validation 回调中检查输入是否为数组,并添加了puts admin_emails.present?,但它返回了false,就好像它从未见过字符串输入一样。
【问题讨论】:
标签: ruby-on-rails arrays postgresql validation