2016-01-25 4 views
2

У меня есть две модели, Survey и Question. A Surveyhas_many :questions и a Questionbelongs_to :survey. Я знаю, что может дублировать экземпляр Survey, выполнив следующие действия:ActiveRecord .dup on Association

old_survey = Survey.last 
new_survey = old_survey.dup 

Теперь new_survey будет идентичен old_survey за исключением того, что его атрибут id является nil. Я хотел бы знать, как я могу дублировать связанные объекты, желательно без повторения через них или установки стороннего драгоценного камня.

Я хотел бы сделать что-то вроде этого:

old_survey = Survey.last 
new_survey = old_survey.dup 
new_survey.questions = old_survey.questions.dup 
old_survey.save! 

Приведенный выше код не работает. Если я звоню new_survey.questions.pluck(:id), я вижу, что идентификаторы соответствуют old_survey.questions.pluck(:id), что нежелательно.

Очевидно, я мог бы перебирать только old_survey.questions, но я бы хотел найти более эффективный способ этого.

ответ

3

Вы можете использовать deep_clonable перл: https://github.com/moiristo/deep_cloneable

и тогда вы могли бы сделать что-то вроде этого:

old_survey.dup include: :questions 

Но это добавляет еще зависимость к вашему приложению. Самый простой способ - перебирать старые вопросы опроса и при необходимости назначать идентификаторы. В вашем вопросе говорится, что вы хотите избежать этого, но я действительно считаю, что это лучший (и самый легкий) вариант.

Если вы готовы к петле через соответствующие объекты, это должно сделать трюк:

def clone_with_questions 
    new_survey = self.dup 
    new_survey.save 
    new_survey.questions = self.questions 
    new_survey 
end 

@new_survey = Survey.last.clone_with_questions 

, возможно, придется настроить его немного, чтобы работать с приложением, но это общая идея.

+0

'желательно без повторения через них или установки стороннего драгоценного камня. –

+1

Я бы (к сожалению) согласился. Это не идеально, но он работает без добавления зависимости. – ACIDSTEALTH

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