0

我正在编写一个过滤算法,它将用户输入作为关键字数组,比如

@keywords = ['news', 'TV show', 'games', 'IT']

并查询表,例如我数据库中的视频表。表中有一个字符串字段,其中包含几个用逗号分隔的标签。对于视频实例,如果其标签字段包含一个(或多个)关键字,则应返回它。我从类似的东西开始

@videos = []
@keywords.each |word| do
  @videos.push(Video.where('tags LIKE ?', '%#{word}%'))
end
@videos = @videos.flatten

然后我发现,首先,它会包含重复的视频,其次,它查询数据库的次数与关键字的长度一样多,这根本没有效率。

有什么建议可以改进吗?

4

1 回答 1

0

如果您需要该like子句,则可以这样做:

@videos = Video.where( (@keywords.map { |kw| "tags like \'%#{kw}%\'" }).join(" or ") )

可能不是最 Ruby 风格的,但直截了当。

于 2013-07-31T18:33:09.177 回答