【问题标题】:ordering in rails based on the count of a word present in a single column基于单个列中存在的单词的计数在 Rails 中排序
【发布时间】:2014-05-29 10:12:58
【问题描述】:

我有一个名为 Vendor 的模型。我有三个与之相关的不同模型。

  1. 感言
  2. 服务
  3. 作品

我必须查找每个表格并列出在这些模型之一的列中出现“示例”一词次数最多的供应商(限制为 5 个)。我如何在 Rails 中做到这一点?


我有这样的事情

Vendor.joins(:testimonials).where("testimonials.content LIKE ?","%example%")

我需要找到单词“example”出现次数最多的供应商

【问题讨论】:

  • 该列是字符串类型的吗?
  • 是的,将所有列都视为带有text 数据类型的字符串
  • 可能是这个问题的重复:*.com/questions/5427467/…
  • 顺便说一句,您的问题有点误导:您不想按发生次数分组,而是希望按发生次数排序
  • 对不起,我会改变它@MaxWilliams

标签: ruby-on-rails activerecord ruby-on-rails-4


【解决方案1】:

希望我现在就得到你:

a=[]
vendors.each do |v|
  c=0
  c=v.testimonial.scan(/example/).count
  if c>0
  a=a.concat([{vendor: v, counts: c}])
end

【讨论】:

  • 我认为这将输出计数,而我需要根据每个供应商推荐的“示例”计数来订购供应商
  • 您需要每个供应商,其中包含单词example??
  • 限制应该是 5。我需要每个在他的推荐信中有单词 example 的供应商,他们将按单词 example 的降序排列。这也与列服务和工作相结合。但如果可能的话,那可以等到下一次迭代。
【解决方案2】:

在Ruby中你可以用这种方式来统计一个字符串中子字符串的出现次数,例如

s = "this is a string with an example, example, example"
s.scan(/example/).count  # => 3

【讨论】:

  • 我有类似 Vendor.joins(:testimonials).where("testimonials.content LIKE ?","%example%") 的东西。我需要找到单词“example”出现次数最多的供应商
  • 你反对,你的意思是你只想使用sql,而不是任何post-search ruby​​代码?
【解决方案3】:

这就是我最终这样做的方式。不确定我的问题是否正确。我是在@user3383458 之前的回答的帮助下完成的

vendor = Hash.new
        Vendor.all.each do |v|
            testi_word_count = 0
            service_word_count = 0
            title_word_count = 0
            v.testimonials.each do |testi|
                testi_word_count += testi.content.scan(/#{word_to_search}/).count
                Rails.logger.info "testi_word_count"
                Rails.logger.info testi_word_count
            end
            v.services.each do |service|
                service_word_count += service.name.scan(/#{word_to_search}/).count
                Rails.logger.info "service_word_count"
                Rails.logger.info service_word_count
            end
            v.works.each do |work|
                title_word_count += work.title.scan(/#{word_to_search}/).count
                Rails.logger.info "title_word_count"
                Rails.logger.info title_word_count
            end
            vendor[v]=testi_word_count + service_word_count + title_word_count
        end

【讨论】:

    最近更新 更多