2009-11-12 3 views
26

활성 레코드 모델에서 대리인을 사용하고 :if과 같은 조건을 사용할 수 있습니까?대리인 및 조건이 포함 된 활성 레코드

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

    belongs_to :master, :class_name => "User" 

    def has_master? 
    master.present? 
    end 
end 

답변

30

아니, 당신은 할 수 없습니다,하지만 당신은 마스터가 nil 일 경우 nil을 반환 할 :allow_nil => true 옵션을 전달할 수 있습니다.

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

    # ... 
end 

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

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

그렇지 않으면 더 복잡한 옵션을 위임 매크로 대신 사용하여 사용자 지정 메서드를 작성해야합니다.

class User < ActiveRecord::Base 
    # ... 

    def company 
    master.company if has_master? 
    end 

end 
+0

individual.rb에서

: 접두사 옵션 : 나는를 사용했다. –

+0

시도는 루비 1.9에서만 가능합니다. –

+1

Try는 ActiveSupport를 통해 Ruby 구현에서 사용할 수 있지만 ActiveSupport> = 2.3이 필요합니다. 또한이 코드에서는 try()를 사용하여 실제 이점을 보지 못했기 때문에 고전적인 구현 방법을 사용했습니다. –

1

하나의 모델을 다른 모델보다 더 선호하는 두 모델에 동일한 방법을 위임해야했습니다. master.try (: 기업) 마스터가 전무 인 경우 nil을 반환합니다 그는 새로운 시도 구문을 사용할 수

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