Rails按标签(标签)搜索帖子

时间:2017-08-31 15:22:55

标签: ruby-on-rails search join

我试图根据给定的标签在食谱上实现搜索功能。我遇到了一些问题,试图了解加入它们的工作原理以及代码的确切放置位置。

这是我的食谱模型:

class Recipe < ApplicationRecord
   has_many :ingredients
   has_many :directions
   has_many :labels

   def self.search(search)
     where("recipe_name ILIKE ? OR recipe_description ILIKE ? 
     OR serving_size ILIKE ?", "%#{search}%", "%#
     {search}%", "%#{search}%") 
   end  

end

我的工作正常,因此我可以按recipe_name recipe_descriptionserving_size

等字段进行搜索

我接下来想要完成的是根据它的许多标签搜索食谱:

这是RecipeController

的索引操作
    def index
      @recipes = Recipe.all 
      if params[:search]
          @recipes = Recipe.search(params[:search]).order("created_at DESC")
      else 
          @recipes = Recipe.all.order("recipe_name ASC")
      end
   end

我尝试了几种方法来解决它,但我似乎无法弄清楚,我已经阅读了activeRecord指南中的joins方法。

这是我已经尝试过的东西,不知道为什么我不跟随......

    def self.search(search)
      where("recipe_name ILIKE ? OR #{Recipe.joins(:labels).where(labels.label_name = "?")} ILIKE ? OR serving_size ILIKE ?", "%#{search}%", "%#{search}%", "%#{search}%") 
    end 

在理解使用联接进行搜索时,有人能指出我哪里出错吗?

1 个答案:

答案 0 :(得分:0)

你的语法错了。

您要尝试实现的正确语法是:

def self.search(search)
  joins(:labels).where("recipe_name ILIKE ? OR labels.label_name ILIKE ? OR serving_size ILIKE ?", "%#{search}%", "%#{search}%", "%#{search}%") 
end

请注意,您可能会从此查询中获得重复结果。要解决此问题,请将#uniq调用添加到其末尾:

def self.search(search)
  joins(:labels).where("recipe_name ILIKE ? OR labels.label_name ILIKE ? OR serving_size ILIKE ?", "%#{search}%", "%#{search}%", "%#{search}%").uniq
end

您可以查看this Rails指南了解详情。