1

少し前に、投票可能なポリモーフィック アソシエーションに必要なメソッドとして機能する小さなモジュールを作成しました。もともとは ActiveRecord にのみ使用することを意図していましたが、今では mongo で使用したいと思います。mongoid を使用しているのでこのインスタンスで作成する必要がある関連付けのメソッドはすべて同じ名前であり、ここにあるものはすべて以前のコードを見てください。

# 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

ここで 2 つの問題に気付くでしょう。まず、私は を拡張しています。ActiveRecord::Baseから継承したモデルだけでなく、任意のモデルでこれを機能させるにはどうすればよいActiveRecordですか? 第二に、そのような空のモジュールが実際に必要ActsAsVotableですか? ここで何が間違っていますか?

そのすべてのコードをモジュールに入れるだけで、モデルActsAsVotableから呼び出すことができるのではないでしょうか?includes ActsAsVotable

4

1 に答える 1

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
于 2011-07-02T20:48:36.950 に答える