从三重嵌套实体

时间:2017-03-01 01:37:33

标签: ruby-on-rails nested

首先,如果您需要更多细节,请不要犹豫,我会尽量保持清晰。

我创建了一个允许用户创建漫画的网站,通过创建3个支架:一个用于漫画本身,有许多章节,属于漫画,并且里面有很多页面。

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

由于所有路由都是嵌套的,因此路由本身需要三个参数:'manga_id','chapter_number'和'page_number'。但是,我没有找到有用的设置漫画变量,因为我虽然Rails知道我在说什么。然而,当我在我的布局中集成页面时,我意识到Rails显示错误的结果:

  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'的行(我尝试用'@ chapter.pejis'替换'@ manga.chapters.pejis'但是它让我错误的结果)

我真的没有任何其他想法,我愿意接受任何建议。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

你真的非常接近。你刚刚在sed -i "s/'database' *=> *''/'database' => 'testdb'/g" file 行上弄错了你的嵌套错误。如果它们如下所示,您的嵌套查询将起作用:

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是&#34; @manga.chapters&#34; (您可以将其视为Collection)并且该对象不知道如何回复Array,而pejis只是一个@chapter对象,并且它知道与Chapter的{​​{1}}关系。

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

pejis