Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用Rails 4+;和PostgreSQL数组_Arrays_Postgresql_Ruby On Rails 4 - Fatal编程技术网

Arrays 使用Rails 4+;和PostgreSQL数组

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

我指的是如何在Rails4中使用postgresql数组。更准确地说,我使用的是Rails 4.1.8

我希望强制执行数组不应为空(至少应具有一个或多个值),并在下表中定义phones属性

如下设置
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