当父级不存在时,如何从子级创建父级记录?

时间:2019-01-15 19:08:48

标签: ruby-on-rails

我正在尝试为书籍,章节和笔记建模。

我有以下内容:

class Book < ApplicationRecord
    has_many :chapters
    has_many :notes
end
class Chapter < ApplicationRecord
    belongs_to :book
    has_many :notes
end
class Note < ApplicationRecord
    belongs_to :chapter
end

我可以创建书和笔记。

创建新的Note时,我想做的是创建新的Chapter或将现有的分配给note。换种说法:我试图在父级甚至还没有存在之前就从孩子创建一个父级,或者为该子级分配一个现成的父级。

这是诸如acts_as_taggable_on之类的gem提供的功能。我已经尝试过使用嵌套表单,但无法使其接近我想要的。我想知道我的架构对于这种使用是否正确?您提供的任何指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

在NotesController的create方法中,您可以执行类似的操作

parent_chapter = Chapter.find_or_create_by(name: 'How To Program')
# parent_chapter is now either the existing chapter by that name or a new one
new_note = Note.new(params[:note])
new_note.chapter = parent_chapter # or new_note.chapter_id = parent_chapter.id
new_note.save

find_or_create_by方法是我在这里需要的。 如果该方法在您的Rails版本中不推荐使用,请尝试first_or_create,就像这样

parent_chapter = Chapter.where(name: 'How To Program').first_or_create