找到可能有多个值的列,Rails

3

我想搜索一个列等于一个值,另一个列有多个值的情况...

这可以实现,每个值对应一个列...

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

这个不起作用...

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

在Rails中,最好的解决方法是什么?

谢谢。


1
20代表什么? - Deej
似乎唯一可能的方法是 <%= Post.where("category LIKE ? OR commentary LIKE ? OR commentary LIKE ? ", 20, "%mom%", "%mother%").count %> - Mike Li
那看起来真的很低效。 - user749798
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%" )

有没有不重复注释的方法?例如,如果我有“妈妈”,“母亲”,“妈咪”,“madre”等等... - user749798

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指南。 (由于我不在开发机器上,因此我尚未测试代码,因此可能需要稍加调整)。

然后您可以像这样使用它:

Post.categories_like(['mom', 'mother', 'madre']).count

正如你在其他地方指出的那样,这并不是世界上最有效的代码,但是从SQL的角度来看,你所要求的内容也不特别高效。


谢谢。以下是翻译的文本:我会将来如果需要搜索一些类似这样的编程内容时使用。给你点个赞并将支票发给Muhamamd。 - user749798

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接