代码之家  ›  专栏  ›  技术社区  ›  Cannon Moyer

Rails 6不工作

  •  0
  • Cannon Moyer  · 技术社区  · 6 年前

    当我使用 scope 属性

    我和他们之间有一种多对多的关系 Product Machine .我的联接表名为 ProductMachine .

    在我的联接表中,我有以下验证:

    validates :product_id, uniqueness: { scope: :machine }
    

    我正在构建一个导入工具,允许我通过csv导入创建产品和机器的关联。在本次导入中,我使用了创建新记录的代码,如下所示:

    machine = Machine.first
    machine.product_machines.new(product_id: 1234)
    machine.product_machines.new(product_id: 1234)
    machine.product_machines.new(product_id: 5678)
    machine.save!
    

    当我打电话的时候 machine.save! 新的 product_machines 被插入数据库,验证不会失败。如果我再次运行同样的代码,它会像预期的那样失败。我想这是因为 范围 正在验证中生成where子句,这会导致新记录丢失,因为没有持久化。这个问题怎么解决?以下是范围验证的文档。

    https://guides.rubyonrails.org/active_record_validations.html#uniqueness

    1 回复  |  直到 6 年前
        1
  •  0
  •   tadman    6 年前

    您正在验证,对于任何给定的机器,它只能链接到同一个产品一次。您没有验证您只能将一台机器链接到一个产品。

    通常,这类联接表都有一个 UNIQUE 约束,以确保您没有重复的链接。

    如果您试图强制执行一个链接和一个链接,使该表有效地成为一对一,那么您需要进行不同的约束。

    推荐文章