我应该如何为 Rails 中的列中的唯一数组值定义约束?

How should I define a constraint for unique array values within a column in Rails?

我正在尝试在我的 Rails CRM 应用程序中存储一些线索。这是示例 Lead 模型。

class Lead < ActiveRecord::Base
  belongs_to :campaign
  validates_presence_of :name
end

这是我用来将潜在客户存储在数据库中的示例迁移。

class CreateLeads < ActiveRecord::Migration
  def change
    create_table :leads do |t|
      t.string :name,          null: false, default: ""
      t.string :contacts,      null: false, array: true, default: []
      t.string :emails,        null: false, array: true, default: []
      t.string :budget,        null: false, default: "Not Specified"
      t.string :requirements,  null: false, array: true, default: []
      t.timestamps null: false
    end
  end
end

我的潜在客户可能有多个电子邮件地址、联系电话和要求。因此,我决定将上述列实现为数组。

我想确保 none 的潜在客户电子邮件地址或联系人用于在数据库中创建新的潜在客户行。

我应该使用模型还是通过迁移来实现它?请指导我如何以 rails 的方式实现它。

行实现中的数组 - 有问题

数组在 table 秒内?请尽可能避免。建立关系数据库是为了在 table 秒内保存记录。人类和数据库都明白这一点。除非有一些令人信服的理由这样做,否则我看不出有充分的理由将一大堆记录转储到一个数组中,在同一条记录上,parse/find/validate 等更难。我不认为这种情况可以证明该设计决策是合理的。我没有查看底层实现,但即使实现与您添加单独的 table 相同,这对于处理您的应用程序的程序员来说可能会更加混乱。

解决方法:添加一个新的table

使用另一个 table 作为主要电子邮件地址。即 emails。添加以下列:idlead_idemail。和 link 通过 lead_id 外键。然后在创建新潜在客户时,您必须通过检查电子邮件 table 该电子邮件地址是否已存在来验证该潜在客户。

您可以添加一个数据库约束来检查电子邮件是否已经存在,或者您可以通过模型进行验证,或者两者结合?