我有Lead,一种用户。我使用单表继承。领导有很多笔记。
# A Lead is a type of User that might be interested in using our service.
class Lead < User
has_many :notes, dependent: :destroy
accepts_nested_attributes_for :notes,
reject_if: proc { |atrs| atrs['info'].blank? }
end
# Used to keep information about a particular lead's behavior.
class Note < ActiveRecord::Base
belongs_to :user
validates :info, presence: true
end
迁移看起来像
class CreateNotes < ActiveRecord::Migration
def change
create_table :notes do |t|
t.references :lead, index: true, foreign_key: true
t.text :info
t.timestamps null: false
end
end
end
这在使用sqlite3
的开发中运行良好,但在使用pg
进行生产时,我收到类似
PG::UndefinedTable: ERROR: relation "leads" does not exist
: ALTER TABLE "notes" ADD CONSTRAINT "fk_rails_c82accd29c"
FOREIGN KEY ("lead_id")
REFERENCES "leads" ("id")
(0.5ms) ROLLBACK
rake aborted!
所以我改变了迁移
t.references :user, index: true, foreign_key: true
我改变了主角
has_many :notes, as: :user, dependent: :destroy
这几乎可行。但是运行@lead.notes.build
或@lead.destroy
等命令会给我一个错误::user_type
:notes
发生了什么。
答案 0 :(得分:1)
从
更改迁移t.references :lead
到
t.references :user
是对的。但是,为了使整个过程保持正常,您必须在关联中指定一个外键。
class Lead < User
has_many :notes, dependent: :destroy, foreign_key: :user_id
# code
end
您可能还需要更改一些验证。例如
validates_presence_of :lead_id
到
validates_presence_of :user_id
pg
在部署时不应再给您错误。
我知道,因为我就是这样修理的。
答案 1 :(得分:0)
错误表示数据库中没有名为lead的表 在开发模式下是否有一个名为lead的表。检查一下。
如果有名为lead的表,那么检查您的迁移是否存在迁移以创建首先执行的潜在客户表,然后迁移以创建备注。