如何将存储在变量中的值用作方法调用?

时间:2016-11-11 19:37:47

标签: ruby metaprogramming

我有一个看起来像这样的方法:

> rating
=> "speed"

然后我有一个看起来像这样的电话:

profile.ratings.find_by(user: current_user).speed

我想要做的是将rating的值传递给该电话。

但是当我这样做时:

 profile.ratings.find_by(user: current_user).rating

它不起作用,因为每个rating对象上没有名为ratings的方法。

这是我在运行上述内容时遇到的错误:

  Rating Load (4.5ms)  SELECT  "ratings".* FROM "ratings" WHERE "ratings"."profile_id" = $1 AND "ratings"."user_id" = 7 LIMIT $2  [["profile_id", 12], ["LIMIT", 1]]
NoMethodError: undefined method `rating' for #<Rating:0x007fca0c4fba90>

我通常会进行字符串插值,但现在我正在进行方法调用。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

如果您想访问ActiveRecord模型上的属性,他们会提供一个简单的访问者:

profile.ratings.find_by(user: current_user)[rating]

这比send方法更安全,因为它只会获取属性。如果你有一个名为ban_and_charge_ten_bucks!的方法,如果你在没有检查你正在呼叫的情况下调用send,那么一些恶意用户可能会调用你的系统。

答案 1 :(得分:2)

您可以使用send method

profile.ratings.find_by(user: current_user).send(rating)