Как получить родительские данные, если дочерние данные не существуют

#ruby-on-rails #ruby

Вопрос:

Я пытаюсь получить дочерние данные, если они существуют, но когда они равны нулю, они получат родительские данные.

Я не хочу жестко кодировать это в представлении, потому что для этого потребуется что-то вроде:

 if @product.parent
  @product.price ? @product.price : @product.parent.price
end
 

Поэтому я подумал, что было бы лучше поместить что-то в модель продукта, чтобы переопределить этот конкретный атрибут, например:

 # app/models/product.rb
def price
  if self.parent
    self.price ? self.price : self.parent.price
  end
end
 

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

Есть ли какой-нибудь способ создать функцию, которая будет выполнять ту же функциональность, которая будет применяться ко всем атрибутам?

Я хочу иметь возможность получить любой атрибут от родителя, если он недоступен у ребенка

Спасибо

Комментарии:

1. Вы могли бы использовать помощник по просмотру def price(model) ; model.price || model.parent.try(:price) ; end

2. это все еще важно, потому что вам придется указывать там каждый атрибут, например цену

Ответ №1:

вы можете создать функцию, которая сначала ищет атрибут в объекте, если его нет, она ищет атрибут в связанном родительском объекте

   def get_attribute(attr)
    self.send(attr).present? ? self.send(attr) : self.parent.send(attr)
  end
 

затем в объекте вы можете извлечь атрибут с помощью

 obj = Model.find(id)
obj.get_attribute(:attr_name)