Mongoid:在将模型传递给Controller之前,在Model中添加一些动态(非DB)字段

时间:2013-06-12 10:03:17

标签: ruby-on-rails mongoid

假设我有一个使用Item

的模型Mongoid
class Item

  include Mongoid::Document

  field :title, type: String
  ...
  ...

end

我希望在将数据传递给Controller之前在Model中向Item添加一些动态字段 - 因为Item正由多个控制器使用。

例如,我想通过添加thumb + /path/to添加我将生成的filename字段。

我尝试了attr_accessor的一些解决方案:

  class Item

    include Mongoid::Document

    field :title, type: String
    ...
    ...

    attr_accessor :thumb

    def prepare_data
      @thumb = "/path/to/thumb"
    end

  end

......稍后在一些控制器中:

@items_all = Item.all
@thumbs = [] 
@items_all.each do |i]
  i.prepare_data
  @thumbs.push(i[:thumb])
end

# @thumbs >>> (empty)

所以我似乎在这里遗漏了一些因为它不起作用。

我也可以避免每次手动调用prepare_data吗?可以在after_initialize的帮助下? (这对我也没用)。

1 个答案:

答案 0 :(得分:0)

我发现了自己的错误。首先我忘记添加after_initialize :do_something然后我发现我可以使用@ attributes.merge!

  after_initialize :do_after_initialize

  def do_after_initialize
    @attributes.merge!({
                         :title => self.get_title, 
                         :type  => self.get_type,
                         :thumb => ImageUploader::thumb(self[:pictures][0]["filename"])
                         :price_f => ActionController::Base.helpers.number_to_currency(self[:price], {:precision=>0}) 
                       })
  end