2016-09-27 90 views
0

我創建使用採用以下模式我的應用程序的第二個版本:版本和多態關聯

class List < ActiveRecord::Base 
    has_many :listable_items 
    has_many :lists, through: :listable_items, source: :listable, source_type: 'List' 
end 

class ListableItem < ActiveRecord::Base 
    belongs_to :list 
    belongs_to :listable, polymorphic: true 
end 

module V2 
    class List < List 
    has_many :listable_items 
    has_many :lists, through: :listable_items, source: :listable, source_type: 'V2::List' 

    self.inheritance_column = :_non_existing_column 
    end 
end 

Module V2 
    class ListableItem < ListableItem 
    belongs_to :list, class_name: "V2::List" 
    belongs_to :listable, polymorphic: true 

    end 
end 

list = V2::List.find_by(slug: "people") 
=> #<V2::List:0x007fd6e9007f18 id: 97, title: "People"....> 

list.listable_items 
=> [#<V2::ListableItem:0x007fd6e6497ec8 id: 2633, list_id: 97, listable_id: 100, listable_type: "List",....] 

list.listable_items.first.listable 
=> #<List:0x007fd6e4185868 id: 100,...> 

我想這是因爲在ListableItems的listable_type列類定義的發生。當我調用關聯記錄時,有沒有辦法讓它引用模型的V2版本,而不是在db列中定義的版本?

加入

def listable_type 
    "V2::" + super 
end 

到ListableItem類沒有改變類稱爲可列的。

回答

0

解決方法是重寫可列表方法,而不是listable_type方法。可能有更好的方法來做到這一點,但這種方式爲我工作。

Module V2 
    class ListableItem < ListableItem 
    belongs_to :list, class_name: "V2::List" 
    belongs_to :listable, polymorphic: true 

    def listable 
     ("V2::" + listable_type).constantize.find(listable_id) 
    end 
    end 
end 
+0

雖然此代碼段可以解決的問題,[包括一個解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於改善您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 –