0

モデルで多くの同様のインスタンス メソッドを動的に生成する ActiveRecord マクロについてどこかで読んだような気がしますが、今は (オンライン ドキュメントや RoR ブックを調べても) 見つかりません。

私はプレーンな古い Ruby を使用して問題を解決しましたが、それを行うためのより良い (より Rails-y の) 方法があれば、それについて知りたいです。

CharacterGearおよびモデルがありModifiersます (はい、これは RPG 用のアプリです)。キャラクターには、ステータスにモディファイアを追加するギアがあります。そのため、彼の装備 (および彼の装備の修飾子) を照会し、関連する統計の修飾子を合計する各統計のメソッドが必要です。(以下のコードのメソッドを参照してください)。

したがって、私の Character モデルは次のようになります。

class Character < ActiveRecord::Base
  has_many :gears
  has_many :modifiers, :as => :modifiable, :through => :gears

  stats = ["hp", "bab", "ac"]  # etc...


  stats.each do |method_name|
    define_method method_name do 
      self.modifiers.where(:kind => method_name).sum(:amount)  
    end    
  end

end

だから、このように私はできる

>  jim = Character.create(:name => "Jim")

そして、ジムに彼の「hp」、「bab」、または「ac」を変更するギアを与えてください。

>  jim.hp

また

>  jim.ac

等...

4

2 に答える 2

2

これはより多くの (Rails-y) 方法ではありませんが、コードの代替手段です。メソッドがありません。

rubyLearning.comがそれについて言わなければならないことはどこにありますか。

オブジェクトにメッセージを送信すると、オブジェクトは、メソッド ルックアップ パスで最初に見つかった、メッセージと同じ名前のメソッドを実行します。そのようなメソッドが見つからない場合、オブジェクトに method_missing と呼ばれるメソッドを提供していない限り、NoMethodError 例外が発生します...

def method_missing(m, *args, &block)  
  self.modifiers.where(:kind => method_name).sum(:amount)    
end

このアプローチの長所は、統計配列を維持し、それらをループして各統計のメソッドを定義する必要がないことです。短所は、ユーザーに missing_method が存在するたびにこのコードを実行すると危険になる可能性があることです。

于 2012-05-16T19:23:53.323 に答える
0

ActiveRecord::Base.storeおそらく、Rails 3.2 で登場したのことを考えているでしょう。それを使用すると、次のようなことができます。

class Character < ActiveRecord::Base
  store :stats, accessors: [:hp, :bab, :ac]
end
 
jim = Character.create(:name => "Jim")
jim.hp = 100

注:列は、値に十分なスペースがあることを確認する列statsとして定義する必要があります。text

詳しくは Rails のドキュメントを参照してください

于 2012-05-16T13:40:21.573 に答える