ヘルパーは、より機能的なアプローチを採用しています。
module ProductsHelper
def tiered_price(product, tier, quantity)
price = case tier
when 1 then product.price * 1.2
when 2 then product.price * 1.4
else product.price * 1.6
end
price * product.quantity
end
end
# view
<%= number_to_currency( tiered_price(@product, 1, 2) ) %>
しかし、これはモデルではより良いと思われます:
class Product < ActiveRecord::Base
def tiered_price(tier, quantity)
price = case tier
when 1 then price * 1.2
when 2 then price * 1.4
else price * 1.6
end
price * quantity
end
end
# view
<%= number_to_currency(@product.tiered_price(1, 2)) %>
@product.tier_one_quanity_two を find_by_name のように本当に書きたい場合は、method_missing にフックする必要があります。これには複雑さと速度のオーバーヘッドがありますが、次のようになります。
class Product < ActiveRecord::Base
def method_missing(method, *args)
match = method.to_s.match(/tier_(.*)_quantity_(.*)/)
if match && match[0] && match[1]
unit_price = case match[0]
when 'one' then price * 1.2
when 'two' then price * 1.4
else price * 1.6
end
quantity = case match[1]
when 'one' then 1
when 'two' then 2
#.. and so on
end
unit_price * quantity
else
super
end
end
end