5

私のアプリケーションでは、Widgetモデルがあります。これは、テーブルによる関連付けを通じてhas_manyをFeature持つモデルです。 WidgetFeature

要件に従って、WidgetFeatureオブジェクトを送信するときに、関連付けられている特定の機能について、そのオブジェクトにもfeature_nameを追加する必要があります。
それを行うには2つの方法があります。

  1. オブジェクトを送信するときに、次のようにします。
widget_feature_object[:feature_name] = feature_name_value

widget_feature_object[:feature_name]次に、オブジェクトに(キー、値)ペアがあるため 、コントローラーまたはビューでアクセスできるので、別のペアを追加することもできます。

2。モデルfeature_name仮想属性WidgetFeature作成し、そのためのゲッターメソッドとセッターメソッドを作成します。

私の知る限り、モデルに実際に存在するフィールドとは異なる別のビューを作成する場合は、仮想属性を使用する必要があります(たとえば、フルネーム=名+姓)。
同じことがここにも当てはまりますか?

また、Railsはオブジェクトに対してキャッシュを実行しますか?これは、最初のアプローチを使用するときではなく、仮想属性を使用するときに役立つ可能性がありますか?

各アプローチの長所と短所は何ですか?また、私の要件に従ってどれが最も適していますか?どうもありがとう。

4

3 に答える 3

6

別のアプローチを提案します:use 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を使用します。それ以外の場合は、一般的な関数を使用してください。

キャッシュする場合は、メモ化を調べてください

于 2011-07-03T18:44:47.657 に答える
0

[]表記を使用して属性にアクセスすることを主張する理由はわかりませんが、従うべき1つのパスは次のとおりです。

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 に答える