2009-11-12 24 views
26

Active Record modelinizde temsilci kullanmak ve üzerinde :if gibi koşullar kullanmak mümkün müdür?Temsilci ve koşullar ile Aktif Kayıt

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

    belongs_to :master, :class_name => "User" 

    def has_master? 
    master.present? 
    end 
end 

cevap

30

Hayır, olamaz, ancak usta nil ise nil dönmek için :allow_nil => true seçeneği geçebilir.

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

    # ... 
end 

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

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

Aksi takdirde, daha karmaşık seçenekleri için temsilci makro kullanarak yerine kendi özel yöntem yazmak gerekir.

class User < ActiveRecord::Base 
    # ... 

    def company 
    master.company if has_master? 
    end 

end 
+0

individual.rb gelen

: önek seçeneği: kullandım. –

+0

try yalnızca ruby'de kullanılabilir 1.9 –

+1

ActiveSupport ile herhangi bir Ruby uygulamasında kullanılabilir, ancak ActiveSupport> = 2.3 gerektirir. Ayrıca, bu kodda try() kullanmanın gerçek bir avantajını görmedim, bu yüzden klasik uygulama ile gittim. –

1

Aynı yöntemi iki modele devretmek zorunda kaldım, diğeri üzerinde bir model kullanmayı tercih ettim. master.try (: şirket) usta nil ise nil dönecektir O yeni deneyin sözdizimi kullanabilirsiniz

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 
İlgili konular