Прежде всего, это не ruby-ish, чтобы делать p[:title]
, a[:image]
и т. Д. (Кроме того, вы вводите три дополнительных символа на вызов метода, и вы знаете, жизнь коротка.) Просто сделайте p.title
, a.image
и т. Д. Итак, ваш код должен выглядеть следующим образом:
q = Question.new(title: p.title, post: p.post)
p.answers.each do |answer|
q.answers.build(body: answer.body)
if answer.images
answer.images.each do |image|
q.answers.photos.create(image: image)
end
end
end
Теперь вы хотите создать новые фотографии для answer
, который вы создали здесь:
q.answers.build(body: answer.body)
Вместо этого вы пытаетесь вызвать photos
для перечислимого, возвращаемого q.answers.photos
.И, естественно, у перечислимого (ActiveRecord_Associations_CollectionProxy
в данном случае) такого метода нет.Итак, вы получаете ошибку undefined method
.
Вы можете попробовать:
q = Question.new(title: p.title, post: p.post)
p.answers.each do |answer|
new_answer = q.answers.build(body: answer.body)
if answer.images
answer.images.each do |image|
new_answer.photos.create(image: image)
end
end
end
За исключением того, что вы еще не сохранили new_answer
, поэтому у него нет id
.В этом случае это может все еще ошибка.
Итак, возможно:
q = Question.new(title: p.title, post: p.post)
p.answers.each do |answer|
new_answer = q.answers.create(body: answer.body)
if answer.images
answer.images.each do |image|
new_answer.photos.create(image: image)
end
end
end
Я не уверен, если вы действительно хотите все эти дубликаты Photo
с (возможно, вы делаете).Но, если вы этого не сделаете, я думаю, что я бы сделал что-то вроде:
class AnswerPhoto < ApplicationRecord
belongs_to :answer
belongs_to :photo
end
class Answer < ApplicationRecord
belongs_to :question
has_many :answer_photos
has_many :photos, through: :answer_photos
end
class Photo < ApplicationRecord
belongs_to :question
has_many :answer_photos
has_many :answers, through: :answer_photos
end
В этом случае вы могли бы сделать что-то вроде:
q = Question.new(title: p.title, post: p.post)
p.answers.each do |answer|
new_answer = q.answers.create(body: answer.body)
new_answer.photos << answer.photos
end
Мне кажется, у вас есть некоторыеN+1
Запросы продолжаются там, так что вы захотите посмотреть на .include
.И, поскольку вы на самом деле не используете answer.photos
в качестве правильных объектов ruby (вам действительно нужны эти id
s), вы можете заглянуть в .pluck
.