Активная запись с делегатом и условия
Возможно ли использовать делегат в вашей модели 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
Ответы
Ответ 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