4

has_statuses メソッドを定義する StatusesExtension というモジュールを作成したいと思います。クラスが StatusesExtension を拡張すると、それらのステータスの検証、スコープ、およびアクセサーが含まれます。モジュールは次のとおりです。

module StatusesExtension
  def has_statuses(*status_names)
    validates :status, presence: true, inclusion: { in: status_names }

    # Scopes
    status_names.each do |status_name|
      scope "#{status_name}", where(status: status_name)
    end

    # Accessors
    status_names.each do |status_name|
      define_method "#{status_name}?" do
        status == status_name
      end
    end
  end
end

このモジュールを拡張するクラスの例を次に示します。

def Question < ActiveRecord::Base
  extend StatusesExtension
  has_statuses :unanswered, :answered, :ignored
end

私が直面している問題は、スコープが定義されている間、インスタンス メソッド (回答済み?、未回答?、および無視された?) が定義されていないことです。例えば:

> Question.answered
=> [#<Question id: 1, ...>]
> Question.answered.first.answered?
=> false # Should be true

モジュールを使用して、モジュールの単一のクラス メソッド (has_statuses) のコンテキスト内でクラス メソッド (スコープ、検証) とインスタンス メソッド (アクセサー) の両方を定義するにはどうすればよいですか?

ありがとうございました!

4

1 に答える 1

4

コメントが言っているように、メソッドは定義されていますが、期待どおりに機能していません。これは、メソッド内で文字列をシンボルと比較しているためだと思われます(status_namesはシンボルの配列でありstatus、文字列になります)。次のことを試してください。

status_names.each do |status_name|
  define_method "#{status_name}?" do
    status == status_name.to_s
  end
end
于 2013-05-07T13:58:58.647 に答える