Подтвердить что ты не робот

Активная запись с делегатом и условия

Возможно ли использовать делегат в вашей модели 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
4b9b3361

Ответ 1

Нет, вы не можете, но вы можете передать параметр :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

Ответ 2

Мне нужно было делегировать тот же метод двум моделям, предпочитая использовать одну модель над другой. Я использовал опцию: префикс:

от 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