has_many:things,as :: model,dependent :: destroy

时间:2016-08-04 04:08:44

标签: ruby-on-rails ruby postgresql

我有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

发生了什么。

2 个答案:

答案 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的表,那么检查您的迁移是否存在迁移以创建首先执行的潜在客户表,然后迁移以创建备注。