Один из способов заключается в создании всех трех вместе, возможно, что-то вроде этого:
class Commodity
def self.create(commodity_name, excel_name)
c = Commodity.new(commodity_name)
e = ExcelFile.new(excel_name)
c.xau = Commodity::PriceSeries.new(e, commodity_name)
return c, e
end
end
Использование:
commodity, excel = Commodity.create("gold", "example.xls")
Метод create
типичный метод класса:
- Там ничего особенного в методе или его имени.
- Метод не определен ни в одном типичном суперклассе.
- Некоторые разработчики называют этот вид метода
make
или factory
или init
.
- Он полностью не связан с контроллером приложений Rails
create
.
Этот вид создания иногда называют «заводским» образцом дизайна. Образец аналогичен фабрике, которая создает полностью построенный продукт с кучей деталей.
Чтобы согласовать модели в непрерывном режиме, рассмотрим шаблон проектирования «проводник» a.k.a. «медиатор». Шаблон аналогичен симфоническому дирижеру, который координирует различных музыкантов, или менеджер-менеджер, который помогает людям работать друг с другом.
Код, приведенный выше, является всего лишь предложением указать вас в правильном направлении; вы напишете свой код для ваших конкретных потребностей, например, если вы хотите более чем одну серию цен на товар или товарное имя, отличное от названия ценовой серии, и т. д.
Если вам нужна куча вариантов, вы можно использовать опции хэш, написав что-то вроде этого:
def self.create(options={})
c = e = nil # it's good practice to initialize these
if options[:commodity_name]
c = Commodity.new(options[:commodity_name])
end
if options[:excel_name]
e = ExcelFile.new(options[:excel_name])
end
...
return c, e
end
Использование:
c, e = Commodity.create(commodity_name: "gold", excel_name: "my.xls")
Вы можете сделать параметры по желанию, или изменяться, или написать бизнес-логику в вашем create
метод, который обеспечивает параметры по умолчанию, или валидации и т. д.
Существуют способы упрощения такого рода создания, если у вас есть много вариантов или вы хотите сделать это со многими классами.
Более подробную информацию о шаблонах проектирования, см http://en.wikipedia.org/wiki/Software_design_pattern
Спасибо, я был смысл, чтобы найти книгу о шаблонах проектирования. Что делает этот код на самом деле? Я никогда раньше не видел метод create, и он, похоже, не работает при создании классов вместо x = Class.new (param) –
В этом случае, хотя ценовая серия не может существовать без товара, но товар может иметь нулевой или несколько ценовых серий, –