34
class Task < ActiveRecord::Base
  attr_accessible :due_date, :text

  def self.this_week
    where(:due_date => Date.today.beginning_of_week..Date.today.end_of_week)
  end
end

class Important < ActiveRecord::Base
  attr_accessible :email

  has_one :task, :as => :taskable, :dependent => :destroy

  delegate this_week, :to => :task
end

これまでのところ、試してみると、このデリゲートは期待どおりに機能していませんImportant.this_weekthis_weekクラスにメソッドが定義されていないというエラーが表示されます...

何か案は?このようなクラスメソッドに委任することもできますか?この方法で拡張Taskする別のクラスが1つか2つある可能性があるので、実装する各クラスに大量のコードを複製しない方法でこれがどのように機能するのか興味があります。

4

3 に答える 3

38

ActiveSupport委任コア拡張機能を選択しています。delegateヘルパーは、現在のクラスのインスタンスメソッドを定義して、そのインスタンスがそのインスタンス上の変数への呼び出しを委任するようにします。

クラスレベルで委任する場合は、シングルトンクラスを開き、そこで委任を設定する必要があります。

class Important < ActiveRecord::Base
  attr_accessible :email

  has_one :task, :as => :taskable, :dependent => :destroy

  class << self
    delegate :this_week, :to => :task
  end
end

しかし、これはそれがクラスImportant.taskへの参照であることを前提としています(そうではありません)Task

あなたの人生を困難にするだけの委任ヘルパーに頼るのではなく、ここで明示的なプロキシを提案します:

class Important < ActiveRecord::Base
  attr_accessible :email

  has_one :task, :as => :taskable, :dependent => :destroy

  class << self
    def this_week(*args, &block)
      Task.this_week(*args, &block)
    end
  end
end
于 2013-01-28T18:09:35.583 に答える
31

継承を考慮して、メソッドをクラスメソッドに委任します。

delegate :this_week, :to => :class

このように特定のクラスに委任することができます(Isaac Beteshの回答も参照してください)。

delegate :this_week, :to => :Task

ドキュメントはここから入手できます:http: //api.rubyonrails.org/classes/Module.html#method-i-delegate

于 2015-05-06T09:38:44.470 に答える
12

メソッドを定数に委任できます。大文字と小文字が区別されます。また、メソッドの名前をdelegateシンボルとして渡す必要があります。

class Important < ActiveRecord::Base
  delegate :this_week, :to => :Task
  # Note ':this_week' instead of 'this_week'
  # Note 'Task' instead of 'task'
end
于 2014-08-10T19:35:53.537 に答える