の委任:私はユーザーが得ることができるポイントの種類を表しているいくつかのモデルを持っているダイナミックファインダー
class User
has_many :totals
end
class Total
belongs_to :user
belongs_to :total_type
end
class TotalType
has_many :totals
end
をそしてpoints
とgoals
のような種類が命名されています。私は総に素敵なmethod_missing
追加:
def method_missing(method, *args, &block)
if TotalType.find_by_name(method)
joins(:total_type).where(:total_type => { :name => method }).sum(total)
else
super
end
end
をそしてそれは、私は次のようにいくつかの甘いダイナミックなものを行うことができます:今
user = User.first
user.totals.points #=> 100
user.totals.goals #=> 10
難しい部分。私はユーザーの直接points
とgoals
メソッドを直接呼び出すことができるようにしたい。
class User
# ...
delegate :points, :totals, :to => :totals
end
しかし、もちろん、私はそれは同様にダイナミックだった好む:私はdelegate
を使用する場合、私は先に時間のメソッドの名前を知っている必要があります。私は、ユーザーのmethod_missing
を作成してみましたが、私はtotals
にsend
に何かをしようとしたとき、私はNoMethodError: undefined method 'points' for #<Array:0x007fd2016e1510>
ので、明らかに関連プロキシは、すでに(super
は、簡単な例を維持するために取り残さ)配列に結果セットを変えた取得:
class User
#...
def method_missing(method, *args, &block)
totals.send(method, *args, &block)
end
end
user = User.first
user.totals.points #=> 100
user.points #=> NoMethodError: undefined method 'points' for #<Array:0x007fd2016e1510>
を
これらの動的ファインダー名をハードコードすることなく、この通話をtotals
に転送するにはどうすればよいですか?どんな助けもありがとう、ありがとう!
を何代わりに名前の範囲を使用してはどうですか? –
しかし、私はスコープに 'points'や 'goals'のようなハードコードされた名前を付ける必要があります...私は本当にそれらを動的にしたい。 –