2015-02-06 2 views
2

У меня есть модель Агента, что belongs_to Сценарий. Обе модели имеют поле options, и я хотел бы объединить значения, хранящиеся в Scenariooptions с Agentoptions так, что я могу сделать @agent.options и извлекать значения из обоих Agent и Scenario.Rails добавить в модель на лету

Я пробовал:

# in agent.rb 
def options 
    scenario.options.merge(self.options) 
end 

Но это бросает ошибку Stack too deep.

Любые предложения были бы весьма полезными. Благодаря!

ответ

4

Brennan уже объяснил, что ваши методы options рекурсивно называют себя тем, что приводит к ошибке Stack to deep.

Существует другой (более низкий уровень) способ считывания атрибута активной модели записи: read_attribute. Используя этот метод, вы можете написать:

def options 
    read_attribute(:options).merge(scenario.options) 
end 

Этот метод существует именно для этой утилиты. Узнайте больше о overwriting default accessors in the docs.

+0

Спасибо, это трюк! – Adam

2

Поскольку Agent имеет поле и метод с именем options, при вызове self.options из класса вызывается метод вместо получения поля. Когда вы пытаетесь слиться с self.options, вы рекурсивно рекурсивно. Переименуйте метод.

+1

Спасибо за ваш ответ. Я назвал метод таким же, как поле, надеясь, что я могу переопределить вызов на '@ agent.options', чтобы сохранить существующие ссылки на' @ agent.options'. Есть ли хороший способ объединить два хэша хэша «на лету», поэтому я все еще могу назвать «параметры», но получить оба? Я думаю, лучший способ может состоять в том, чтобы объединить их в обратном вызове 'after_initialize'. – Adam

Смежные вопросы