Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在生产中期更改Mongoid类名_Ruby On Rails_Ruby_Mongodb_Heroku_Mongoid - Fatal编程技术网

Ruby on rails 在生产中期更改Mongoid类名

Ruby on rails 在生产中期更改Mongoid类名,ruby-on-rails,ruby,mongodb,heroku,mongoid,Ruby On Rails,Ruby,Mongodb,Heroku,Mongoid,这可能吗 我有一个名为杂志的mongoid类,还有一些关联,我想将其重新命名为出版物。问题是,我已经有一群用户,他们已经制作了杂志、期刊和文章 原装刀库型号: class Magazine # 1. Include mongoid stuff include Mongoid::Document include Mongoid::Timestamps include Mongoid::Slug # 2. Define fields field :title, type:

这可能吗

我有一个名为
杂志
的mongoid类,还有一些关联,我想将其重新命名为
出版物
。问题是,我已经有一群用户,他们已经制作了杂志、期刊和文章

原装
刀库
型号:

class Magazine
  # 1. Include mongoid stuff
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Slug

  # 2. Define fields
  field :title, type: String
  field :description, type: String
  field :live, type: Boolean, default: false
  field :show_walkthrough, type: Boolean, default: true

  # 3. Set attributes accesible
  attr_accessible :title, :description, :live, :show_walkthrough, :cover_image_attributes, :logo_image_attributes

  # 4. Set slug
  slug :title

  # 5. Set associations
  belongs_to :user
  has_many :issues, dependent: :delete, autosave: true
  has_one :foreword, :as => :articleable, :class_name => 'Article', dependent: :delete, autosave: true
  embeds_one :cover_image, :as => :imageable, :class_name => 'Image', cascade_callbacks: true, autobuild: true
  embeds_one :logo_image, :as => :imageable, :class_name => 'Image', cascade_callbacks: true, autobuild: true

  # 6. Accepting nested attributes
  accepts_nested_attributes_for :cover_image, :allow_destroy => true
  accepts_nested_attributes_for :logo_image, :allow_destroy => true

  # 7. Set validations
  validates_presence_of :title, :description, :cover_image, :logo_image
end
我知道我可以将类名更改为
Publication
,然后在mongodb上执行
db.magazies.renameCollection(“publications”)
,但关联不会随之发生


有什么建议吗?

我看你们的期刊和前言模型中有一些关联字段,可能是指杂志。因此,如果您愿意更改类和基础集合的名称,那么重命名这些关联字段是您的主要问题。您可能会遇到以下情况:

class Issue
  belongs_to :magazine
end
您可以将此关联重新定义为
属于:publication
。假设您乐于修复代码中对
Issue#magazine
的所有引用,那么剩下的问题是
issues
集合中将充满具有
magazid
字段的文档,而不是
publication\u字段
。有两个选项可以修复数据库映射

第一个选项是重命名数据库中的字段。看

第二个选项是声明关联,以便通过覆盖“外键”名称将其映射到旧数据库字段:

belongs_to :publication, foreign_key: :magazine_id

您必须对前言模型和引用
杂志的任何其他模型重复此操作,这只是多态性和类继承的一个提示

Mongoid通过将类名存储为文档属性来处理继承和多态关联

在类本身上,它存储为
“\u type”
属性

对于多态关联,如
所属:多态类
mongoid添加了一个属性
“多态类类型”
,以便在浏览多态关联时可以解析该类(使用Rails'
.constantize


因此,如果您决定更改类名,并且您有继承或多态关联,那么您还必须重写所有这些属性

这真的不可能吗?在我看来,我基本上只需要更改关系名称以及集合名称。不过我不知道怎么做。谢谢你的澄清。如果执行选项1,重命名集合中的列名,则所有发布id都将消失。那不好。如果我选择选项2(我认为应该是:属于:出版物,外文密钥::杂志id),那么我可以保留id,但关联仍然不起作用。我做错了什么?你是对的-我把球打错了方向,我会更新的。对于选项1,当您将
杂志id
重命名为
出版物id
时,它应该保留这些值。你能在mongo shell里查一下吗?如果这样做有效,并且关联被重命名为
publication
,那么它应该可以工作。当将杂志id重命名为publication\u id时,它会保留杂志id,但关系不再起作用。关系破裂了。这是为什么?您还需要更改关联名称,例如
属于:publication
以及代码中对关联的任何引用。