2014-02-18 64 views
1

我想動態地添加密鑰到MongoMapper文檔。紅寶石元編程與MongoMapper

def build(attrs={}) 
    doc = self.new 
    apply_scope(doc) 
    doc.set_up_keys! 
    doc.attributes = attrs 
    doc 
end 

def set_up_keys! 
    return unless form 

    form.fields.each do |f| 
    next if self.keys.include?(f.underscored_name) 

    self.class.send(:key, f.underscored_name, f.keys['default'].type, :required => f.required, :default => f.default) 
    end 
end 

有問題的代碼可herehere

form是一個相關的模型。我想根據form#fields具有的當前模型(self)創建密鑰。

問題是,如果我創建兩個模型,它們兩個模型都具有相同的鍵。

self.class.send(:key...)將鍵添加到模型中。

他們爲什麼被添加到兩個模型?

是因爲該方法是在類上下文中調用的嗎?

我怎樣才能影響個人實例?

+0

不要將它發送到類。 –

+0

但是不是#key類方法嗎?不確定我是否遵循:( – jordelver

回答

2

Mongomapper按類定義模型。這個類的所有實例都共享模型的關鍵字。如果你想創建即時的模型,你可能需要dynamically create a class,並且鍵添加到它:

def build(attrs={}) 
    c = Class.new(self.class) 
    doc = c.new 
    apply_scope(doc) 
    doc.set_up_keys! 
    doc.attributes = attrs 
    doc 
end 
+0

謝謝!我不得不稍微改變它爲'c = Class.new(klass.new.class)',但除此之外它效果很好,我改變了原始代碼以使用'#send'在'self.class'而不是'class_eval'因爲一個不同的問題,這就是當這個新問題出現時,'class_eval'隻影響實例的類(singleton class/eigenclass),而不是所有類的類? – jordelver

+0

AFAIK'class_eval'是一個類方法,而不是一個實例方法,所以這個問題似乎沒有什麼意義 - 它會影響它所調用的類。 –