Arrays 使用Rails 4+;和PostgreSQL数组
我指的是如何在Rails4中使用postgresql数组。更准确地说,我使用的是Rails 4.1.8 我希望强制执行数组不应为空(至少应具有一个或多个值),并在下表中定义phones属性 如下设置Arrays 使用Rails 4+;和PostgreSQL数组,arrays,postgresql,ruby-on-rails-4,Arrays,Postgresql,Ruby On Rails 4,我指的是如何在Rails4中使用postgresql数组。更准确地说,我使用的是Rails 4.1.8 我希望强制执行数组不应为空(至少应具有一个或多个值),并在下表中定义phones属性 如下设置null:false会阻止我执行Contacts.create(phones:nil),但Contacts.create(phones:[])会保存到数据库中 class CreateContacts < ActiveRecord::Migration def change crea
null:false
会阻止我执行Contacts.create(phones:nil)
,但Contacts.create(phones:[])
会保存到数据库中
class CreateContacts < ActiveRecord::Migration
def change
create_table :contacts do |t|
t.string :name
t.text :phones, array: true, null: false
end
end
end
class CreateContacts
我可以使用什么约束来确保Contacts.create(phones:[])
引发一个错误,指出数组中至少应该有一个条目?我建议您改用
class CreateContacts < ActiveRecord::Migration
def change
create_table :contacts do |t|
t.string :name
t.text :phones, null: false
end
end
end
常规状态验证应该满足您的要求,因为空数组不存在
class Contact < ActiveRecord::Base
validate :phones, presence: true
end
class联系人
我现在意识到,为什么您的答案实际上是一个更好的方法,而不是使用postgresql阵列对rails4+的支持,至少从我目前看到的情况来看,至少在上述场景中是这样。更准确地说,我特别观察到的是,如果我使用PostgreSQL数组支持存储一个整数数组,比如[3,4]
,然后使用它们进行比较,我得到的结果是错误的,因为它将[“3”,“4”]
与[3,4]
进行比较。对于序列化,这不会发生。非常感谢您的回答。很高兴为您提供帮助!!据我所知,社区中并没有真正使用DB数组字段支持。唯一的问题是,我仍然无法检查数组是否至少包含一个元素,我认为这是因为ruby中的[].nil?
返回false。我看到记录仍然保存在DB中,没有抛出任何错误,当phones属性被分配给空数组时给出。标准的存在:true
(AFAIK称之为空白?
)应该在(Rails)验证过程中起作用。如果希望数据库引发异常,则需要手动添加检查约束;我会同时这样做,因为数据有效性和完整性逻辑确实属于数据库内部。我支持序列化
这是一个丑陋的黑客:它快速而简单,但几乎总是一个会让你受苦的大错误。如果YAML编码器决定更改引号、间距、UTF-8编码等,检查YAML字符串的相等性可能会有问题。。。(这些变化确实会随着时间的推移而发生。)+1对于Lacsdaisical:)的使用,谢谢,我想我实际上完全同意你的观点,我只是不知道为什么。当phones
为空或只是ActiveRecord验证时,你是在从数据库中寻找异常?实际上两者都是,直到你提出这个问题。我不知道目前两者之间的区别,以及应该在什么时候做出相应的选择。我将对此进行更多研究。
class Contact < ActiveRecord::Base
validate :phones, presence: true
end
class Contact < ActiveRecord::Base
validate :phones, presence: true
end