2011-09-05 18 views
12

Mongoid'de model için ayarlayıcıyı veya alıcıyı geçersiz kılmanın bir yolu var mı? gibi bir şey:Mongoid modelinin ayarlayıcılarını ve alıcılarını geçersiz kılma

class Project 
    include Mongoid::Document 
    field :name, :type => String 
    field :num_users, type: Integer, default: 0 
    key :name 
    has_and_belongs_to_many :users, class_name: "User", inverse_of: :projects 

    # This will not work 
    def name=(projectname) 
    @name = projectname.capitalize 
    end 
end 

name yöntem sanal alanlarını kullanarak olmadan üzerine yazılır nerede?

+0

related: http://stackoverflow.com/questions/6699503/mongoid-custom-setters-getters-and-super – marcgg

cevap

16
def name=(projectname) 
    self[:name] = projectname.capitalize 
end 
+1

@ user923636 oluşturulduktan sonra bir belgenin "_id" alanını değiştiremezsiniz. Yani proje adı değişirse, eski belgeyi silmeniz ve değiştirilen adla yeni bir tane oluşturmanız gerekir. – rubish

23

daha iyi kullanılması

def name=(projectname) 
    super(projectname.capitalize) 
end 

yöntem

self[:name] = projectname.capitalize 

Ben geçersiz kılmak gerek ile benzer bir sorunu vardı sonsuz özyineleme

+1

teşekkürler ben özünden [: isim]. super çalışıyor – GTDev

+0

@GearHead Ayrıca kodumun parçaları kendi [: name] notasyonu kullanır ve şimdiye kadar herhangi bir özlemle karşı karşıya olmasa da, zamanlama üzerinde süper zamana (daha iyi görünüyor) geçtiniz. – rubish

+2

Süper sınıf yoksa nasıl süper çalışırdı? 'Mongoid :: Document' Modül olarak eklenmiştir, burada kafam karışmış ... – tothemario

1

neden olabilir onunla aşırı nedeni, tehlikeli olabilir belongs_to: kullanıcı ilişkisi için "kullanıcı" ayarlayıcısı. Ben sadece bu durum için değil, aynı sınıfta zaten tanımlanmış olan herhangi bir metodu sarmak için bu çözümden geldim.

class Class 
    def wrap_method(name, &block) 
    existing = self.instance_method(name) 

    define_method name do |*args| 
     instance_exec(*args, existing ? existing.bind(self) : nil, &block) 
    end 
end 

Bu, modelin sınıfında aşağıdaki işlemleri sağlar:

wrap_method :user= do |value, wrapped| 
    wrapped.call(value) 
    #additional logic here 
end 
+0

Tam olarak aradığım şey ve hoş bir çözüm. +1 – user2398029

+0

Bisikleti yeniden icat etmeye çalışmayın. Bunun için alias_method_chain kullanın. – sandrew

+0

Bunun için teşekkürler! İlişki düzenleyicileri ve alıcıları ile de sorun yaşıyorum. sandrew'un yorumu, a_m_c'nin içine bakmamı ve Ruby 2.0'ın Modül # prepend'i hakkında bilgi almamı sağladı. Harika çözüm ve gerçekten temiz - http://dev.af83.com/2012/10/19/ruby-2-0-module-prepend.html –