在检索三重嵌套实体时,问题 /不良数据



首先,如果您需要更多详细信息,请不要犹豫,我会尽量清晰。

我创建了一个网站,该网站允许用户通过创建3个脚手架来创建芒果:一个用于漫画本身,其中有许多章节,属于漫画,其中包含许多页面。

为了获得更好的用户体验,我替换了URL中的ID,并用章节编号和页码替换ID,并使用FillydiD将漫画的名称在URL中列出,因此漫画的第一章中的第一页看起来如下:localhost:3000/epic-manga/1/1

由于所有路线都是嵌套的,因此路线本身需要三个参数:'Manga_id','Chapter_number'和'page_number'。但是,我发现设置漫画变量并没有用,因为我知道我在说什么。但是,当我将页面集成在布局中时,我意识到铁轨显示错误的结果:

  private
    #Peji stands for 'page' in japanese, don't ask
    def set_peji
      @chapter = Chapter.find_by(chapter_number: params[:chapter_id])
      @peji = @chapter.pejis.find_by(scan_number: params[:id])
    end

Rails Doc说," Find_by"将选择与其研究相匹配的第一个项目。加载页面时,SQL请求如下:SELECT 'chapters'.* FROM 'chapters' WHERE 'chapters'.'chapter_number' = 1 LIMIT 1。但是,每个芒果至少都有第一章。

我最大的问题是我真的不知道如何设置'set_peji'函数以将搜索限制为拥有章节/页面的漫画,因此我尝试了以下内容:

def set_peji
  @manga = Manga.find_by(slug: params[:manga_id])
  @chapter = @manga.chapters.find_by(chapter_number: params[:chapter_id])
  @peji = @manga.chapters.pejis.find_by(scan_number: params[:id])
end

但是,结果我有一个错误: undefined method 'pejis' for #<Chapter::ActiveRecord_Associations_CollectionProxy:0x007fbe30667380>在靶向包含" @peji"的行时(我尝试替换'@manga.chapters.pejis'by'@chapterch.pepejis'

我真的没有其他想法,我对任何建议都开放。

预先感谢您!

您实际上真的很接近。您刚刚在peji线上错误地嵌套了。如果您的嵌套查询看起来像这样:

def set_peji
  @manga = Manga.find_by(slug: params[:manga_id])
  @chapter = @manga.chapters.find_by(chapter_number: params[:chapter_id])
  @peji = @chapter.pejis.find_by(scan_number: params[:id])
end

您在@manga.chapters.pejis上遇到错误的原因是@manga.chapters是" Collection"(您可以将其视为Array),并且该对象不知道如何响应pejis,而@chapter只是一个单个Chapter对象,并且它意识到pejischapter的关系。

这当然假设您在模型中已经设置了以下关系(这是我测试上述代码的方式):

# app/models/manga.rb
class Manga < ActiveRecord::Base
  has_many :chapters
end
# app/models/chapter.rb
class Chapter < ActiveRecord::Base
  belongs_to :manga
  has_many :pejis
end
# app/models/peji.rb
class Peji < ActiveRecord::Base
  belongs_to :chapter
end

最新更新