Создать метод, который возвращает значение атрибута связанного объекта, если атрибут текущего объекта равен nil (тип jsonb) - PullRequest
0 голосов
/ 29 мая 2019

У меня есть два следующих класса:

class Account < ActiveRecord::Base
  # columns
  # ...
  # features :jsonb

  has_one :plan
end

class Plan < ActiveRecord::Base
  # columns
  # ...
  # features :jsonb
end

И будет вызывать функции, подобные этой:

account.features    # being account is an instance of Account
# or
account.features[:feature_key]

Дело в том, что я хочу, чтобы account искал features или features[:feature_key] внутри себя, и если это nil или empty, ему следует выбрать значение из связанного объекта Plan.

Что-то вроде:

features.present? ? features : plan.features
# and
features[:feature_key].present ? features[:feature_key] : plan.features[:feature_key]

Но в правильном методе в Account классе

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Не уверен, что полностью понимаю, но учитывая ваш комментарий под другим ответом, я предполагаю, что вы ищете что-то вроде:

class Account < ActiveRecord::Base 

  def feature_info(key)
    return plan.features[key] unless features.present? && features[key].present?
    features[key]
  end 
end

Тогда называется

   account = Account.first
   account.feature_info(:feature_key)

Это может быть чище, хотя

class Account < ActiveRecord::Base 
  def features 
    read_attribute(:features) || {} 
  end
  def feature_info(key)
    return plan.features[key] unless features[key].present?
    features[key]
  end 
end
0 голосов
/ 29 мая 2019

Ну, это не лучшая практика, но вы можете переопределить метод получения с помощью специального метода. В вашем случае:

def features
  return features[:feature_key] if features[:feature_key].present?
  return plan&.features[:feature_key] if plan&.features[:feature_key].present?
end

Не уверен, что вам нужна такая логика, но она сработает для переопределения, если вы включите ее в модель Account. Предпочтительный способ сделать это - присвоить методу другое имя и вызвать этот метод, чтобы при необходимости вы могли получить доступ к неизмененному атрибуту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...