我有这样的模式:红宝石EVAL重构
Class User
has_many :comments
# have field 'name' in DB
end
Class Comment
belongs_to :user
end
,我已经非常复杂,非常困难的理解管理员后台,它可以获取所有车型,并允许从管理界面控制它。它获取所有关联并用evals处理它。
而这样的eval正常工作:
eval("comment." + o[0][:object])
其中o [0] [:对象] = “user.name”
但我想要做它没有EVAL。这种方法的工作原理,但它不是很普遍:
comment.send("user").send("name")
而在实际的代码看起来很丑陋:
(o[0][:object].split(".").count < 2) ? h(object.send(o[0][:object])) : h(object.send(o[0][:object].split(".")[0]).send(o[0][:object].split(".")[1]))
那么,什么是让EVAL的univesality这样contructions最好的方式,如果我想显示更多嵌套呼叫,如:
comment.user.first_friend.haters.count
???
命名作用域在创建复杂的查找器时非常流行。至于重构eval,看起来你可能可以用单表继承来完成它。 – CambridgeMike
它看起来很丑,因为你在内联 - 在现实生活中,你会编写一个方法,递归或迭代,调用当前对象的下一个方法,设置当前对象,并继续执行直到完成或发生错误。除此之外,你的目的并不清楚 - 你是否试图避免为每个模型写一个管理页面? –