2009-11-12 49 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

不,你不能,但你可以通过: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

他可以使用新的尝试语法:master.try(:公司),这将返回nil,如果主人是零。 – 2009-11-12 11:21:51

+0

尝试仅适用于Ruby 1.9 – 2009-11-12 19:27:17

+1

尝试通过ActiveSupport在任何Ruby实现中提供,但它需要ActiveSupport> = 2.3。此外,在这段代码中,我没有看到使用try()的任何真正的优势,所以我使用了经典的实现。 – 2009-11-12 19:43:30

1

我需要委托相同的方法到两个模型,宁愿使用另一个模型。我使用的:前缀选项:

从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