这甚至可能吗?
我有一个名为Magazine
的mongoid类,也有一些关联,我想重新命名为Publication
。问题是我已经有很多用户已经制作了杂志,问题和文章。
原始Magazine
型号:
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.magazines.renameCollection( "publications" )
,但这些关联不会随之而来。
有什么建议吗?
答案 0 :(得分:0)
我看起来你的问题和前言模型中有关联字段,可能是指杂志。因此,如果您足够高兴地更改类和基础集合的名称,则重命名这些关联字段是您的主要问题。你可能有类似的东西:
class Issue
belongs_to :magazine
end
您可以将此关联重新定义为belongs_to :publication
。假设很高兴修复代码中对Issue#magazine
的所有引用,那么剩下的问题是,您的issues
集合中将包含magazine_id
字段而不是{{1}的文档}}。您有两种方法可以修复数据库映射。
第一个选项是重命名数据库中的字段。见mongoDB : renaming column name in collection
第二个选项是声明关联,以便通过覆盖“外键”名称映射到旧数据库字段:
publication_field
您必须为前言模型和引用belongs_to :publication, foreign_key: :magazine_id
的任何其他模型重复此操作。
答案 1 :(得分:0)
专注于多态和类继承。
Mongoid通过将类名存储为文档属性来处理继承和多态关联。
在类本身上,它存储为"_type"
属性
对于像belongs_to :polymorphic_class
这样的多态关联,mongoid会添加一个属性"polymorphic_class_type"
,以便在浏览多态关联时可以解析该类(使用Rails'.constantize
)。
因此,如果您决定更改类名,并且您具有继承或多态关联,那么您还必须重写所有这些属性!