2016-04-26 66 views
0

我使用這種方法來挑選類似的帖子,我已經把它放在post.rb。現在我遇到兩個問題1.我收到一個錯誤。 2.如何將我落實到視圖或控制器這得到類似的職位?:類似的帖子在rails

class Post < ActiveRecord::Base 
def similar_posts(post) 
    title_keywords = post.title.split(' ') 
    Post.all.to_a.sort do |post1, post2| 
    post1_title_intersection = post1.body.split(' ') & title_keywords 
    post2_title_intersection = post2.body.split(' ') & title_keywords 

    post2_title_intersection.length <=> post1_title_intersection.length 
    end[0..9] 
end 
end 

我得到的錯誤:

syntax error, unexpected ',', expecting keyword_end Post.all.to_a.sort |post1, post2|^
syntax error, unexpected keyword_end, expecting end-of-input 

回答

2

你錯過了你的塊的參數之前的do

Post.all.to_a.sort do |post1, post2| 
end 

然而,有一個與你的方法的一大缺陷(這與您手頭的語法問題無關):您將加載到內存中數據庫中的每一篇文章。這是一個可怕的想法。

相反,使用某種全文搜索,使用單獨的表格作爲製表符,使用一些外部服務,如ElasticSearch等。這些都是爲此目的而設計的。

1
  1. 你忘了do這裏:

    Post.all.to_a.sort |post1, post2| 
    
  2. 它落實到服務或模式,而不是一個控制器或視圖。因爲它只是嚴格浪費你的代碼。對於服務,您可以發出延遲操作以在後臺查找所需的帖子。因此,要使用延遲服務,您可以使用例如寶石service。當以這種方式組織您的服務操作時,您可以使用緩存設施(如redis)發出請求,然後存儲處理該請求的結果。

    如果你會用它在模型聲明爲一個方法:

    class Post 
        def similar_posts 
         title_keywords = self.title.split(' ') 
         Post.all.sort do |post1, post2| 
         post1_title_intersection = post1.body.split(' ') & title_keywords 
         post2_title_intersection = post2.body.split(' ') & title_keywords 
    
         post2_title_intersection.length <=> post1_title_intersection.length 
        end[0..9] 
    end 
    

    然後使用它像如下:

    @posts = Post.find_by_id(params[:id]).similar_posts 
    

但由於它只是用於顯示,似乎更好地將其添加到decorator作爲一種方法。此外,爲了增加訪問的結果,你可以使用redis

+0

IV使用支架生成上崗一個簡單的應用程序,如何將我實現這個展現類似的帖子?謝謝 –

+0

@ user5724342這取決於你希望看到什麼,以及在哪裏 –

+0

我希望在展會上查看每個帖子和標題。 Iv將代碼實現到我的模型中,但我不確定如何在我的視圖中使用它? –

0

你缺少

變化

Post.all.to_a.sort |post1, post2| 
to 
Post.all.to_a.sort do |post1, post2| 

這將解決語法錯誤

相關問題