2009-11-12 9 views
26

È possibile utilizzare delegato nel modello di record attivo e utilizzare condizioni come ?Registrazione attiva con delegato e condizioni

class User < ApplicationRecord 
    delegate :company, :to => :master, :if => :has_master? 

    belongs_to :master, :class_name => "User" 

    def has_master? 
    master.present? 
    end 
end 

risposta

30

No, non si può, ma si può passare l'opzione :allow_nil => true di restituire nil se il padrone è pari a zero.

class User < ActiveRecord::Base 
    delegate :company, :to => :master, :allow_nil => true 

    # ... 
end 

user.master = nil 
user.company 
# => nil 

user.master = <#User ...> 
user.company 
# => ... 

In caso contrario, è necessario scrivere il proprio metodo personalizzato utilizzando invece la macro delegato per opzioni più complesse.

class User < ActiveRecord::Base 
    # ... 

    def company 
    master.company if has_master? 
    end 

end 
+0

avrebbe potuto usare la nuova sintassi try: master.try (: società) che restituirà nullo se master è pari a zero. –

+0

provare è disponibile solo in ruby ​​1.9 –

+1

Try è disponibile in qualsiasi implementazione Ruby tramite ActiveSupport ma richiede ActiveSupport> = 2.3. Inoltre, in questo codice non ho visto alcun reale vantaggio dell'utilizzo di try(), quindi sono andato con l'implementazione classica. –

1

avevo bisogno di delegare lo stesso metodo per due modelli, preferendo utilizzare un modello sopra l'altro. Ho usato l'opzione: prefisso:

da individual.rb

delegate :referral_key, :email, :username, :first_name, :last_name, :gender, :approves_email, :approves_timeline, to: :user, allow_nil: true, prefix: true         
delegate :email, :first_name, :last_name, to: :visitor, allow_nil: true, prefix: true 

def first_name 
    user.present? ? user_first_name : visitor_first_name 
end