4

传递数据以我应用,我有一个Widget模型,Feature模型与由WidgetFeature表通过相关联的的has_many。当使用虚拟属性或在散列中的Rails 3

按要求,当我发送WidgetFeature对象,我应该FEATURE_NAME追加到它为好,对于相关的给定功能。
有在它去两种方式:

  1. 虽然发送的对象,这样做:
widget_feature_object[:feature_name] = feature_name_value 

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

2。制造feature_name a 虚拟属性WidgetFeature模型,然后创建获取和设置方法它。

据我所知,当您要创建从实际出现在模型的字段(如姓名=名+姓)不同有不同的看法,你应该使用虚拟属性。
同样的东西也适合在这里吗?

还有,Rails是否对对象做了一些缓存,在使用虚拟属性时可能会有用,而不是在我使用第一种方法时会变得有用?

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

回答

5

我会提出另一种方法:使用delegatedocumentation)。

WidgetFeature我会写:

class WidgetFeature 

    belongs_to :feature 

    delegate :name, :to => :feature, :prefix => true 
end 

,那么你将能够编写

f = WidgetFeature.first 

f.feature_name #will return f.feature.name 

希望这有助于。

0

我不知道为什么你坚持使用[]符号访问您的属性,但遵循一条路径是这样的一个:

def [](attr) 
    if attr == :feature 
    feature # Return the associated feature object 
    else 
    super  # Call ActiveRecord::Base#[] 
    end 
end 

你当然可以用一些元编程好的起来自动检测有效的关联。

我个人真的不喜欢的Monkeypatching以这种方式,但因为[]是一个简单的方法,你可能是安全的。好处是这可以让你widget_feature [:feature] [:name]甚至widget_feature [:feature] [:name] =

你可以获得调用widget_feature.feature的所有ActiveRecord功能。

+0

@Martjin:我明白你在说什么。但是问题是关于选择虚拟属性还是仅仅在散列中传递必要的数据。这只是关于数据发送,这是主要关心的问题,如果缓存做了额外的虚拟属性。 您能否现在以更好的方式回答问题 –

2

使用attr_accessor当你想能够设置的方法。否则,只需使用一般功能。

如果你希望缓存,看看memoization

+0

我知道attr_accessor会做什么,如果仔细查看问题,那么memoization在这里没有用处。 – user738184