3

我正在尝试搜索一列可能等于一个值而另一列可能具有多个值的位置...

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

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

这不起作用...

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

在rails中解决这个问题的最佳方法是什么?

谢谢你。

4

2 回答 2

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%" )
于 2013-07-30T21:00:06.820 回答
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 术语中也不是特别有效。

于 2013-07-30T21:32:16.640 回答