4

gem を構築していて、その機能の一部を拡張したいのですが、そのActiveRecord::Associations::Builder::BelongsTo方法がわかりません。

したがって、基本的にユーザーは次を指定できる必要があります。

class Event < ActiveRecord::Base
  belongs_to :users, foo: true
end

誰もそれを行う方法を知っていますか??

これはうまくいきません:

module Mygem
  module BelongsToFoo

    def valid_options
      super + [:foo]
    end

    #... other functionality
  end
end

class ActiveRecord::Associations::Builder::BelongsTo
  extend MyGem::BelongsToFoo
end

コンソール

ActiveRecord::Associations::Builder::BelongsTo.valid_options.include? :foo
#=> false   ... :(

Event
ArgumentError: Unknown key: foo

属している_ソースコード

================================================== =========================== アップデート

流れるデルウィンの答え私は自分のコードをもう一度見ようとしましたが、彼は正しいですが、それを含める必要がありActiveRecord::Associations::Builder::BelongsToますが、変数valid_optionsもあります。

だから私はできる

ActiveRecord::Associations::Builder::BelongsTo.new(:a, :b, :c).valid_options.include? :foo
# => true

だけでなく、

ActiveRecord::Associations::Builder::BelongsTo.valid_options.include? :foo
# => true

したがって、実際にはこのように見えるはずです

module MyGem
  module BelongsToFoo
    extend ActiveSupport::Concern

    included do
      self.valid_options += [:foo]
    end

    def valid_options
      super + [:foo]
    end

    def define_callbacks(model, reflection)
      # this wont get executed
      add_foo_callbacks(model, reflection)# if options[:foo]
      super
    end

    def add_foo_callbacks(model, reflection)
      # therefore this wont either 
    end
  end
end

これを試しても

module MyGem
  module BelongsToFoo

    def define_callbacks(model, reflection)
      raise "dobugging"
    end
  end
end

Rails は私のメソッドのオーバーライドを完全に無視します。

はい、私は自分のオプションを定義できますが、何もしません:(何か提案はありますか?

4

2 に答える 2

2

valid_options はインスタンス メソッドであるため、extend の代わりに include を使用する必要があります。

module MyGem
  def valid_options
    super + [:foo]
  end
end

class ActiveRecord::Associations::Builder::BelongsTo
  include ::MyGem
end

relation = ActiveRecord::Associations::Builder::BelongsTo.new(:a, :b, :c)
relation.valid_options.include? :foo
#=> true 

それが役立つことを願っています。

于 2013-08-21T16:16:41.230 に答える