我正在尝试创建一个comment实例。它会返回一个验证错误。
A comment has one moderation并包含reportable。所以您可以执行moderation.reportable,然后它返回comment。
我希望在创建新的moderation时创建comment实例。
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必须存在
编辑
试图添加:
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)
发布于 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。
编辑
after_create :create_moderation
def create_moderation
blog = self.blog
self.create_moderation!(blog: blog)
end我看到这两个方法名是相同的,即在创建注释之后,调用create_moderation,它再次调用create_moderation。您可以尝试更改方法的名称吗?
另一个SUGESSTION
您可以将方法更改为
def create_moderation
blog = self.blog
Moderation.create!(blog: blog, reportable: self)
end或
def create_moderation
blog = self.blog
comment = self
comment.create_moderation!(blog: blog)
end你还会犯同样的错误吗?
发布于 2017-12-01 08:54:29
您可以尝试以下代码:
class Comment < ApplicationRecord
include Reportable
before_create :create_moderation
def create_moderation
blog = self.blog
self.build_moderation(blog: blog)
end
endhttps://stackoverflow.com/questions/47589023
复制相似问题