2017-03-01 41 views
0

首先,如果您需要更多详细信息,请不要犹豫,我会尽量保持清晰。从三重嵌套实体检索结果时发生问题/错误数据

我创建了一个网站,允许用户创建mangas,创建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的医生说那是find_by“将选择其研究相匹配的第一个项目。当我加载页面时,SQL请求如下所示:SELECT 'chapters'.* FROM 'chapters' WHERE 'chapters'.'chapter_number' = 1 LIMIT 1。然而,每一个mangas至少有第一章。

我最大的问题是,我真的不知道如何设置“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

你其实很接近。您在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 
+0

你是对的,我是如此接近它驱使我疯了!万分感谢! – Jaeger

+1

@Jaeger欢迎编程和/或导轨。 10年后,我开始减少这些错误;) –

+1

2年半,我很乐意让它接近功能代码:D – Jaeger