我正在尝试搜索一列可以等于一个值而另一列可以有多个值...
这是有效的,每个都有一个值...
<%= Post.where("category LIKE ? OR commentary LIKE?", 20, "%mom%").count %>
这不起作用......
<%= Post.where("category LIKE ? OR commentary LIKE?", 20, [{"%mom%", "%mother%"}]).count %>
如何在rails中解决这个问题的最佳方法?
谢谢。
答案 0 :(得分:2)
您要做的只是使用IN
你可以这样做;
<%= Post.where("category LIKE ? OR commentary LIKE? OR commentary LIKE?", 20, "%mom%", "%mother%"]).count %>
这将生成以下sql查询;
SELECT Count(*) FROM `posts` WHERE (category like "20" OR commentary like "%mom%" OR commentary like "%mother%" )
答案 1 :(得分:2)
您可以将其添加为范围,以将重复移至Post
类:
class Post < ActiveRecord::Base
scope :categories_like, ->(to_match) {
where(
[to_match.map("category like ?").join(" OR ")] +
(to_match.map { |m| "%#{m}%" })}
范围添加尽可能多的category like ?
子句,因为有匹配的类别,然后添加要与%
前缀和后缀匹配的每个事物。有关添加范围的更多详细信息,请参阅rails guide。 (我没有测试过代码,因为我不在我的开发机器上,因此可能需要在正确的方向上稍微推动一下。)
然后您可以像:
一样使用它Post.categories_like(['mom', 'mother', 'madre']).count
正如你在其他地方指出的那样,它并不是全世界最有效的代码,但是你所要求它在SQL术语中也不是特别有效。