如何将 has_one 关联限制为单个记录

Pet*_*kou 2 activerecord ruby-on-rails

我无法在 has_one 关系中只保留一条记录

例子

类别和问题

一个问题属于_一个类别,一个类别有_一个问题

实际上,在我正在构建的系统中看到,即使存在 has_one 关系,也会出现我有多个属于一个类别的问题的情况。

has_one 关系不应该将它们限制为只有一条记录吗?如果没有,那么我如何确保我始终保留一份记录?

编辑

请注意,问题模型对类别 ID 有唯一性规则,但我仍然发现多条记录指向同一类别 ID 的情况。

这怎么可能?

编辑 2

模型概述

class Event < ApplicationRecord
    has_one :travel_time, :inverse_of => :event, dependent: :destroy
end

class TravelTime < ApplicationRecord
     belongs_to :event, :inverse_of => :travel_time
     validates_uniqueness_of :event_id, allow_nil: true 
end
Run Code Online (Sandbox Code Playgroud)

编辑 3

在方法的事件模型中使用,以节省出行时间记录

def store_travel_times(body)
    travel_times = self.build_travel_time

    # get travel times
    ...

    if !travel_times.save
     logger.error "..."
    end
end
Run Code Online (Sandbox Code Playgroud)

用于查找多条记录的查询

 2017-05-04T13:39:15.277063 #50567] DEBUG -- :   TravelTime Load (0.4ms)  SELECT "travel_times".* FROM "travel_times" WHERE "travel_times"."event_id" = $1  [["event_id", 3105]]
Run Code Online (Sandbox Code Playgroud)

Md.*_*mon 5

正如评论中所讨论的,创建数据库级别的约束来检查列的唯一性并避免创建多条记录。您需要使用以下代码创建迁移文件:

add_index :travel_times, :event_id, unique: true
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

  • 不要迂腐,但要确保你的第一个参数是复数。在这种情况下,应该是“add_index :travel_times, :event_id, unique: true”。此外,在使用资源时会自动为关联创建该索引,但默认情况下它不是唯一的,因此您可能需要在迁移之前在该行运行“drop_index :travel_times, :event_id”。 (2认同)