2011-07-02 42 views
1

所以前一段時間我創建了一個小模塊來充當我需要的可投票多態關聯的方法,雖然它最初僅用於ActiveRecord,但我現在想要與蒙戈使用它,因爲我使用mongoid一切,因爲我需要在這intance創建關聯的方法具有相同的名稱和寄託都在這裏看看我以前的代碼:修改ActiveRecord模塊以使用任何模型

# config/initializers/acts_as_votable.rb 

module ActsAsVotable 

end 

module ActiveRecord 
    class Base 
    class << self 
     cattr_accessor :votable 

     def acts_as_votable 
     has_many :votes, :as => :voteable 
     end 

     def acts_as_voter 
     has_many :votes, :as => :voter 
     end 

     def votable? 
     method_defined? :votes 
     end 
    end 

    def votable? 
     self.class.send(:method_defined?, :votes) 
    end 
    end 
end 

這裏是如何使用它:

class Recipe < ActiveRecord::Base 
    acts_as_votable 
    # more stuff... 
end 

所以你會注意到這裏有兩個問題,第一,我擴展了ActiveRecord::Base,我怎樣才能讓這個工作適用於任何模型,而不僅僅是那些從ActiveRecord繼承的模型?其次,我真的需要一個像ActsAsVotable這樣的空模塊嗎?我在這裏做錯了什麼?

如果我只是把所有代碼放入模塊ActsAsVotable,我不應該只能從我的模型中調用includes ActsAsVotable

+0

我真的不明白你的問題。讓我們瞄準你的目標:你想如何使用它? – apneadiving

+0

所以基本上我有一堆方法和關聯我想包含在模型中,如果它包含'acts_as_voter'或'acts_as_votable',你知道嗎?有點像這個插件:https://github.com/eMancu/acts_as_commentable/blob/master/lib/comment_methods.rb –

回答

3

首先,將其放入初始化程序或/lib中,但請確保路徑已加載到您的應用程序中。

module ActsAsVotable 

    extend ActiveSupport::Concern 

    module InstanceMethods 
    def votable? 
     self.class.send(:method_defined?, :votes) 
    end 
    end 

    module ClassMethods 
    cattr_accessor :votable 

    def acts_as_votable 
     has_many :votes, :as => :voteable 
    end 

    def acts_as_voter 
     has_many :votes, :as => :voter 
    end 

    def votable? 
     method_defined? :votes 
    end 

    end 
end 

然後在任何模式:

class User < ActiveRecord::Base 

    include ActsAsVotable 

end 

最後:

User.methods.include?("acts_as_votable") # => true 
+0

這似乎並沒有工作,我做這個初始化?我沒有使用ActiveRecord,那麼如何將這些方法包含在特定的模型中? –

+0

剛編輯我的答案 – apneadiving