【问题标题】:How to limit has_one association to a single record如何将 has_one 关联限制为单个记录
【发布时间】:2017-05-04 12:48:10
【问题描述】:

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

示例

类别和问题

一个问题belongs_to一个类别,一个类别has_one问题

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

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

编辑

请注意,问题模型对类别 ID 有唯一性规则,STILL我发现了多个记录指向相同类别 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

编辑 3

事件模型中用于保存行程时间记录的方法

def store_travel_times(body)
    travel_times = self.build_travel_time

    # get travel times
    ...

    if !travel_times.save
     logger.error "..."
    end
end

用于查找多条记录的查询

 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]]

【问题讨论】:

  • 请分享您的模型、关联和验证。
  • @Md.FarhanMemon 请查看更新后的帖子
  • 您在哪里创建列的创建操作?
  • @Md.FarhanMemon 你的意思是迁移文件?
  • 你能在你看到多条记录的地方发布一个代码吗?我的意思是代码、查询和输出?

标签: ruby-on-rails activerecord


【解决方案1】:

如 cmets 中所述,创建 db 级别约束以检查列的唯一性并避免创建多个记录。您需要使用以下代码创建迁移文件:

add_index :travel_times, :event_id, unique: true

希望对你有帮助。

【讨论】:

  • 不要学究气,但要确保你的第一个论点是复数。在这种情况下,应该是add_index :travel_times, :event_id, unique: true。此外,在使用资源时会自动为关联创建该索引,但默认情况下它不是唯一的,因此您可能需要在迁移之前的行上运行 drop_index :travel_times, :event_id
  • 感谢@boyd 提出这一点,大约 2.5 年前,当我开始使用 Rails 时。(;・∀ ・)
  • 当然!抱歉,这是一个很小的细节。只是觉得如果有新人在寻找您的特定解决方案可能会有所帮助!
猜你喜欢
  • 1970-01-01
  • 2015-07-26
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多