2016-04-26 37 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| 

这将解决语法错误

相关问题