2013-07-17 73 views
0

這甚至可能嗎?更改Mongoid班級名稱中產

我有一個名爲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字段而非publication_field的文檔。您有兩個選項來修復數據庫映射。

第一個選項是重命名數據庫中的字段。見mongoDB : renaming column name in collection

第二個選項是使得它通過覆蓋「的外鍵」名稱映射到舊的數據庫字段來聲明關聯:

belongs_to :publication, foreign_key: :magazine_id 

你將不得不重複此爲前言模型和任何其他參考Magazine

+0

謝謝澄清。如果我做了選項1,重命名集合中的列名,那麼所有的publication_id都消失了。這不好。如果我使用選項2(我認爲應該是:belongs_to:publication,foreign_key :: magazine_id),那麼我會保留該ID,但該關聯仍然不起作用。我在這裏做錯了什麼? –

+0

你說得對 - 我把belongs_to弄錯了,我會更新它。至於選項1,當您將'magazine_id'重命名爲'publication_id'時,它應該保留這些值。你可以在mongo shell中檢查嗎?如果這樣做並且該協會被重新命名爲「發佈」,那麼它應該起作用。 – Steve

+0

將magazine_id重命名爲publication_id時,它會保留magazine_id,但關係不再起作用。關係破裂。這是爲什麼? –

0

只是爲了多態性和類繼承。

Mongoid通過將類名稱存儲爲文檔屬性來處理繼承和多態關聯。

在類本身,這被存儲爲"_type"屬性

對於多態關聯像belongs_to :polymorphic_class mongoid添加屬性"polymorphic_class_type",使得類可以解決(使用Rails' .constantize)瀏覽時多態關聯。因此,如果您決定更改類名稱,並且您有繼承或多態關聯,那麼您還必須重寫所有這些屬性!