首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >活动记录:在创建实例上验证失败

活动记录:在创建实例上验证失败
EN

Stack Overflow用户
提问于 2017-12-01 08:03:44
回答 2查看 404关注 0票数 0

我正在尝试创建一个comment实例。它会返回一个验证错误。

A comment has one moderation并包含reportable。所以您可以执行moderation.reportable,然后它返回comment

我希望在创建新的moderation时创建comment实例。

代码语言:javascript
复制
class Comment < ApplicationRecord
      include Reportable

      after_create :create_moderation

      def create_moderation
        blog = self.blog
        self.create_moderation!(blog: blog)
      end
end


class Moderation < ApplicationRecord
    belongs_to :reportable, foreign_key: "reportable_id", foreign_type: "reportable_type", polymorphic: true
...
end



module Reportable
    extend ActiveSupport::Concern

    included do
      has_one :moderation, as: :reportable, foreign_key: "reportable_id", foreign_type: "reportable_type", class_name: "Moderation"
      has_many :reports, through: :moderation
end

失败/错误:self.create_moderation!(博客:博客)ActiveRecord::RecordIn有效值:验证失败: Reportable必须存在

编辑

试图添加:

代码语言:javascript
复制
belongs_to :reportable, foreign_key: "reportable_id", foreign_type: "reportable_type", polymorphic: true, optional: true

并得到:

ActiveRecord::NotNullViolation: PG::NotNullViolation: reportable_id列中的空值:空值违反了非空约束细节:失败行包含(2,1,注释,null,0,null,12-12-01 09:02:11.81419,2017-12-01 09:02:11.81419,Blog,不中度)。*在“版本号”("blog_id“、"reportable_type”、"created_at“、"updated_at”、"blog_type")中插入返回"id“的值($1、2、3、4、5)

EN

回答 2

Stack Overflow用户

发布于 2017-12-01 08:37:06

尝试联合使用optional: true。如下所示:

belongs_to :reportable, foreign_key: "reportable_id", foreign_type: "reportable_type", polymorphic: true, optional: true

请参考。Rails 5中引入了optional: true

编辑

代码语言:javascript
复制
after_create :create_moderation

def create_moderation
  blog = self.blog
  self.create_moderation!(blog: blog)
end

我看到这两个方法名是相同的,即在创建注释之后,调用create_moderation,它再次调用create_moderation。您可以尝试更改方法的名称吗?

另一个SUGESSTION

您可以将方法更改为

代码语言:javascript
复制
def create_moderation
  blog = self.blog
  Moderation.create!(blog: blog, reportable: self)
end

代码语言:javascript
复制
def create_moderation
  blog = self.blog
  comment = self
  comment.create_moderation!(blog: blog)
end

你还会犯同样的错误吗?

票数 1
EN

Stack Overflow用户

发布于 2017-12-01 08:54:29

您可以尝试以下代码:

代码语言:javascript
复制
class Comment < ApplicationRecord
  include Reportable

  before_create :create_moderation

  def create_moderation
    blog = self.blog
    self.build_moderation(blog: blog)
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47589023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档