2011-07-02 4 views
1

これまでしばらく前にActiveRecordだけで使用することを意図していましたが、使用可能なポリモーフィックな関連付けに必要な方法として、小さなモジュールを作成しました。ここ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 

とを:私の以前のコードを見てみモンゴでそれを使用して、私はこのintanceで作成する必要がある団体のための方法のすべてをmongoid使用していますので、同じ名前と、ここでeverthingを持っていますどのように使用されたのですか:

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

ここで2つの問題は、まず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

関連する問題