#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)