0

この種の動作で構成されたオブジェクトを作成したい:

page = MinimalistCms::Page.create
page.test #return undefined method
page.parts.create!(title: 'test', body: 'test')
page.test #return 'test'
page.test = 'a body'
page.test #return 'a body'

これを行うために、このクラスを作成しました:

module PartComposition
  def self.included(model_class)
    model_class.class_eval do
      has_many :parts, class_name: 'PagePart'
    end
  end

  def method_missing(name, *args)
    title = name.to_s.downcase.underscore
    if title.end_with?('=')
      return update_part(title, args.first)
    else
      part = find_part(title)
      if part
        return part.body
      else
        super(name, *args)
      end
    end
  end

  private
  def update_part(title, attribute)
    part = find_part(title.chop)
    return part.update_attribute(:body, attribute)
  end

  def find_part(title)
    parts.with_globalize(title: title).first
  end
end

動作しますが、これを行うpage.body = 'test'と自動的にレコードが保存されます。それが最善の方法かどうかはわかりません。

初めて、page.test は未定義のメソッドを返す必要があります。パーツを作成するには、新しい仮想属性を作成する必要があります。この属性は、通常の属性とまったく同じように機能する必要があります。

アイデアはありますか?

4

1 に答える 1

0

パーツを保存したくない場合は、part.body = attribute代わりにpart.update_attribute. 次に、保存されていないパーツのリストを保持するインスタンス変数を使用できます。またはをdirty_parts発行するときに、パーツを保存して を呼び出したり、パーツの関係を設定したりできます。savesave!superautosave

とにかく今が好きです。

于 2013-04-15T00:31:55.473 に答える