找到列可以有多个值的位置,rails

时间:2013-07-30 20:39:34

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我正在尝试搜索一列可以等于一个值而另一列可以有多个值...

这是有效的,每个都有一个值...

<%= Post.where("category LIKE ? OR commentary LIKE?", 20, "%mom%").count %>

这不起作用......

<%= Post.where("category LIKE ? OR commentary LIKE?", 20, [{"%mom%", "%mother%"}]).count %>

如何在rails中解决这个问题的最佳方法?

谢谢。

2 个答案:

答案 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术语中也不是特别有效。