5

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

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

  1. 发送对象时,请执行以下操作:
widget_feature_object[:feature_name] = feature_name_value

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

2. 在模型中创建feature_name一个虚拟属性WidgetFeature然后为其创建getter 和 setter 方法

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

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

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

4

3 回答 3

6

我会提出一种替代方法:使用delegate文档)。

WidgetFeature我会写:

class WidgetFeature

  belongs_to :feature

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

然后你就可以写了

f = WidgetFeature.first

f.feature_name #will return f.feature.name

希望这可以帮助。

于 2011-07-05T08:38:16.250 回答
2

如果您希望能够设置方法,请使用 attr_accessor。否则只使用一般功能。

如果要缓存,请查看memoization

于 2011-07-03T18:44:47.657 回答
0

我不确定您为什么坚持使用 [] 表示法来访问您的属性,但是要遵循的一条路径是:

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

当然,您可以使用一些元编程来自动检测有效关联。

我个人不太喜欢以这种方式进行猴子修补,但是由于 [] 是一种简单的方法,因此您可能很安全。好处是,这允许您使用 widget_feature[:feature][:name] 甚至 widget_feature[:feature][:name]=

您将获得调用 widget_feature.feature 所需的所有 ActiveRecord 功能。

于 2011-06-29T12:35:29.453 回答