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包含未保存部件列表的实例变量,并且在发出saveor时,save!您可以保存部件并调用super,或放入autosave部件关系。

不管怎样,我喜欢现在的样子。

于 2013-04-15T00:31:55.473 回答