【发布时间】:2018-05-14 14:57:01
【问题描述】:
我有一个模型 Post,每次创建帖子时,我都希望同时创建一个 Moderation 的新实例。
所以在 post.rb 中我使用回调 after_save :create_moderation
然后写一个私有方法:
...
include Reportable
after_save :create_moderation
private
def create_moderation
self.create_moderation!(blog: Blog.first)
end
但是当一个提案被创建时我得到这个错误:
PG::UniqueViolation:错误:重复的键值违反了唯一约束“moderations_reportable”详细信息:键(reportable_type,reportable_id)=(Post,25)已经存在。 :插入“审核”(“blog_id”、“reportable_type”、“reportable_id”、“created_at”、“updated_at”、“blog_type”)值(1美元、2美元、3美元、4美元、5美元、6美元)返回“id”
在 reportable.rb 我有:
has_one :moderation, as: :reportable, foreign_key: "reportable_id", foreign_type: "reportable_type", class_name: "Moderation"
然后是其他一些可报告对象的方法。
请注意,当我在控制台中运行 create 方法时,不会发生此问题。
编辑
create_table "moderations", id: :serial, force: :cascade do |t|
t.string "reportable_type", null: false
t.string "reportable_id", null: false
t.integer "blog_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "blog_type", null: false
t.string "upstream_moderation", default: "unmoderate"
t.index ["blog_id", "blog_type"], name: "moderations_blog"
t.index ["reportable_type", "reportable_id"], name: "moderations_reportable", unique: true
end
create_table "posts", id: :serial, force: :cascade do |t|
t.text "title", null: false
t.text "body", null: false
t.integer "feature_id", null: false
t.integer "author_id"
t.integer "scope_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "post_votes_count", default: 0, null: false
t.index ["body"], name: "post_body_search"
t.index ["created_at"], name: "index_posts_on_created_at"
t.index ["author_id"], name: "index_posts_on_author_id"
t.index ["feature_id"], name: "index_posts_on_feature_id"
t.index ["proposal_votes_count"], name: "index_posts_on_post_votes_count"
t.index ["title"], name: "post_title_search"
end
【问题讨论】:
-
请也向您展示迁移,因为这是数据库错误而不是 ORM 错误
-
@engineersmnky 我编辑了我的帖子
-
而这个
t.index ["reportable_type", "reportable_id"], name: "moderations_reportable", unique: true没有泄露出去? -
抱歉复制粘贴错误
-
没有错误,该行仍然是数据库键约束的一部分。我认为您想将挂钩更改为
after_create而不是after_save,因为save也会在update上被调用
标签: ruby-on-rails ruby postgresql