何时使用虚拟属性或在Rails 3中的散列中传递数据

use*_*184 4 caching ruby-on-rails virtual-attribute ruby-on-rails-3 memorycache

在我的应用程序中,我有一个Widget模型,一个Feature带有has_many的模型,通过WidgetFeature表关联.

根据要求,当我发送WidgetFeature对象时,我也应该将feature_name附加到它,用于相关的给定功能.
有两种方法:

  1. 发送对象时,请执行以下操作:
widget_feature_object[:feature_name] = feature_name_value
Run Code Online (Sandbox Code Playgroud)

然后我可以在我的控制器或视图中访问它,widget_feature_object[:feature_name]因为一个对象有(键,值)对,所以我也可以添加另一个.

2.制作feature_name一个虚拟属性WidgetFeature模型,然后创建getter和setter方法吧.

据我所知,当您想要创建与模型中实际存在的字段不同的不同视图时,您应该使用虚拟属性(例如,全名=名字+姓氏).
同样的事情也适合这里吗?

另外,Rails是否对对象进行了一些缓存,在使用虚拟属性时可能会有用,而不是在我使用第一种方法时?

每种方法的优缺点是什么,哪种方法最符合我的要求?非常感谢.

nat*_*vda 5

我建议另一种方法:使用delegate(文档).

WidgetFeature我这样写:

class WidgetFeature

  belongs_to :feature

  delegate :name, :to => :feature, :prefix => true
end
Run Code Online (Sandbox Code Playgroud)

那你就可以写了

f = WidgetFeature.first

f.feature_name #will return f.feature.name
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.