2017-03-01 38 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