0

小さなモンゴイド ショッピング カートを持つレール用の gem を作成します。

取得するモデルに含めることで実装されますinclude MongoidCart::ActsAsProduct

class MyProduct
   include Mongoid::Document

   include MongoidCart::ActsAsProduct
end


module MongoidCart
  class CartItem
    include Mongoid::Document

    belongs_to :mongoid_cart_cart, :class_name => 'MongoidCart::Cart'
  end
end


module MongoidCart
  class Cart
    include Mongoid::Document

    field :user_id, type: String

    has_many :cart_items, :inverse_of => :cart, :class_name => 'MongoidCart::CartItem'
    belongs_to :customer, :inverse_of => :carts, :class_name => MongoidCart.configuration.customer_model_name

  end
end

-class の -class を -classに持ち込むのに問題がclass_nameあります。クラスへの関係を自動的に追加する必要があります。私が持っているように「ハードコード」すると、エラーはありません。ProductCartItemMongoidCart::CartItem:my_product

どうすれば:the_class_to_point_to_as_symbolダイナミックにできますか?

module MongoidCart
  module ActsAsProduct
    extend ActiveSupport::Concern

    included do

      #adds dynamic association to the CartItem to refer to the ActsAsProduct class
      MongoidCart::CartItem.class_eval(
        'belongs_to :the_class_to_point_to_as_symbol, :class_name => "Product", inverse_of: :cart_item'
      )
    end
  end
 end
4

2 に答える 2

0

私は、文字列を生成する新しいクラスを作成することで終了しました。これは、によって解釈されclass_eval、スコープ外でそれらを呼び出し、文字列を変数に配置します。

module MongoidCart
  module ActsAsProduct
    extend ActiveSupport::Concern

    included do

      # adds dynamic association to the CartItem to refer to the ActsAsProduct class
      relation_method = MongoidCart::Relation.build_product_relation_string(name)
      MongoidCart::CartItem.class_eval(relation_method)
  end
end



module MongoidCart
  class Relation

    # creates a string which can be implemented in models to provide dynamcic relation
    def self.build_product_relation_string(class_name)
      "belongs_to "+ ":#{class_name.to_s.underscore.to_sym}" + ", :class_name => '#{class_name.constantize}', inverse_of: :cart_item"
    end

  end
end
于 2016-04-01T14:45:12.993 に答える
0

self内部included{}ブロックは含まれているクラスなので、次のようなことができます

included do
  MongoidCart::CartItem.add_product_relation(self)
end

MongoidCart::CartItem:

def self.add_product_relation cls
  belongs_to cls.name.to_s.underscore.to_sym, class_name:cls, inverse_of: :cart_item
end
于 2016-04-01T15:21:25.817 に答える