我有两个模型 - 候选人和关键字以及他们之间的has_and_belongs_to_many关联。
如果我想找到一个关键字.name等于某个候选人的所有候选人 - 我只需要在这样的候选模型中进行搜索 - 它运行正常。
def self.search(search)
includes(:keywords).where("keywords.name" => "#{search}")
end
但是如果我需要搜索其中keyword.name包含字符串(相当于“LIKE”子句)的候选者怎么办?我尝试了多种想法,但找不到一个好的解决方案......
答案 0 :(得分:2)
试试这个:
.where("keywords.name LIKE ?", "%#{search}%")
修改的
注意:这需要在.joins
查询之前使用.includes
而不是WHERE
。
答案 1 :(得分:1)
您可以使用参数替换语法使用LIKE查询,使用RAILS支持的任何SQL方言:
def self.search(search)
includes(:keywords).where("keywords.name LIKE ?", "%#{search}%")
end
这会取代'?'在具有修改的搜索值的查询字符串中,使用搜索字符串“sth”生成此SQL条件:
WHERE keywords.name LIKE '%sth%'
在查询字符串外部使用“%”(SQL通配符)预设搜索值。在查询字符串中包含“%”将使它们出现在搜索值的引用表示之外:
WHERE keywords.name LIKE %'sth'%
这根本行不通。