代码之家  ›  专栏  ›  技术社区  ›  Ashishkumar Pandey

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

  •  2
  • Ashishkumar Pandey  · 技术社区  · 9 年前

    我正在尝试在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
    

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

    我希望确保没有使用潜在客户的电子邮件地址或联系人在数据库中创建新的潜在客户行。

    我应该使用模型还是通过迁移来实现这一点?请告诉我如何实施这条铁路。

    1 回复  |  直到 9 年前
        1
  •  -1
  •   BenKoshy Mayinx    4 年前

    行实现中的数组-有问题

    表中的数组?如果可能,请避免。建立关系数据库是为了保存表中的记录。人类和数据库都理解这一点。除非有一些令人信服的理由这样做,否则我看不出有什么好的理由在一个数组中、在同一个记录上、在更难解析/查找/验证等的地方转储一整串记录。我认为这种情况不能证明设计决策是正确的。我还没有研究底层实现,但即使实现与添加了单独的表一样,这对于处理应用程序的程序员来说可能会更加混乱。

    解决方案:添加新表

    emails id , lead_id email .和链接方式 导线id 外键。然后,在创建新的潜在客户时,您必须通过检查电子邮件表中的电子邮件地址是否已经存在来验证该潜在客户。

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

    推荐文章