ruby 为什么我不能在数据库中创建一个对象,如果我添加一个关系belong_to?

xxe27gdn  于 2023-06-22  发布在  Ruby
关注(0)|答案(2)|浏览(99)

我有这个模型,这个模型是中间的table

class CompanyTaskProgress < ApplicationRecord
 include Discard::Model
 belongs_to :task, class_name: 'Tasking::Task'
 belongs_to :progress
end

如果我不添加这些行,它工作得很好:

belongs_to :company_task
 belongs_to :progress

这是我的任务模型

module Tasking
 class Task < ApplicationRecord
  has_many : company_task_progresses, dependent: :destroy
  has_many :progresses, through: : company_task_progresses
 end
end

只有我试图创建一些对象与迭代:

ids.each do |id|
   created = CompanyTaskProgress.create(progress_id:, task_id:)
   p 'RESULT',created
end

我正在获取尚未在db中创建的对象

'RESULT', #<CompanyTaskProgress id: nil, progress_id: 47, task_id: 1000, discarded_at: nil, created_at: nil, updated_at: nil>
brtdzjyr

brtdzjyr1#

belongs_to关联要求关联的记录默认存在,Ruby on Rails添加了验证来确保这一点。这意味着当你加上

belongs_to :company_task

Rails期望在模型的数据库表上有一个company_task_id列,如果不传递分配一个指向现有CompanyTask记录的company_task_id,就不能创建新记录。
不幸的是,你的例子不清楚。注意

CompanyTaskProgress.create(progress_id:, task_id:)

是一条捷径

CompanyTaskProgress.create(progress_id: process_id, task_id: task_id)

但在您的示例中,您迭代了ids并将id传递给块。目前还不清楚您从哪里获得了要迭代的ids。并且不清楚是否在迭代之外以某种方式设置了progress_idtask_id。如果您没有在each块之前设置progress_idtask_id,则CompanyTaskProgress.create(progress_id:, task_id:)快捷方式无法工作,因为这些值将无法正确分配。
我建议在该方法中将create更改为create!,然后您将获得一个异常,并显示一条错误消息,告诉您哪些验证失败。
或者你可能想告诉Rails belongs_to关联是optional,不应该被验证为存在,然后将关联的定义更改为:

belongs_to :company_task, optional: true
7vhp5slm

7vhp5slm2#

我不知道为什么它没有被保存,但我可以告诉你如何找到:
unsaved_object.errors.full_messages
会告诉你对象的验证问题。
如果这还不行,你可以试试
unsaved_object.save!
如果它不保存它就会爆炸并且应该会喷出有用的信息。有时候,数据库问题没有像您希望的那样记录到验证错误中。

相关问题