我试图根据给定的标签在食谱上实现搜索功能。我遇到了一些问题,试图了解加入它们的工作原理以及代码的确切放置位置。
这是我的食谱模型:
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_description
和serving_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
在理解使用联接进行搜索时,有人能指出我哪里出错吗?
答案 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指南了解详情。