具有代表和条件的活动记录

时间:2009-11-12 10:56:33

标签: ruby-on-rails ruby activerecord delegates

是否可以在Active Record模型中使用委托并在其上使用:if等条件?

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

  belongs_to :master, :class_name => "User"

  def has_master?
    master.present?
  end
end

2 个答案:

答案 0 :(得分:36)

不,你不能,但如果主人是零,你可以通过:allow_nil => true选项返回nil。

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

答案 1 :(得分:2)

我需要将相同的方法委托给两个模型,更喜欢使用一个模型而不是另一个模型。我使用了:prefix选项:

来自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