【发布时间】:2020-10-30 07:21:01
【问题描述】:
我正在尝试在 Rails 中创建一个搜索功能,允许用户使用在其标题、“材料列表”或标签列表中找到的关键字来搜索帖子。
按标题搜索既简单又直接。添加搜索“材料”关联表的功能需要研究,但我能够想出:
tags = Tag.where("tag_name LIKE ?","%"+params[:q]+"%").pluck("tag_id")
@searchResults = Post.joins(:materials).where("post.name OR materials.name LIKE ?", "%"+ params[:q]+"%")
但是,现在我想将标签表添加到搜索中。当我尝试以下方法时,我收到 PreparedStatementInvalid 错误:
tags = Tag.where("tag_name LIKE ?","%"+params[:q]+"%").pluck("tag_id")
@searchResults = Post.joins(:materials, :post_tags, :tags).where("post.name OR materials.name LIKE ? OR tags.include?(post_tags.tag_id)", "%"+ params[:q]+"%")
我有一个包含标签名称和标签 ID 列表的表格,以及一个包含没有标签名称的帖子/标签对列表的表格。所以我需要能够进行查询,搜索标签列表,获取 id,然后使用它从 post_tags 表中查找帖子并在搜索中返回。
另一种方法:
tags = Tag.where("tag_name LIKE ?","%"+params[:q]+"%").pluck("tag_id")
@searchResults = Post.joins(:materials, :post_tags, :tags).where("post.name OR materials.name LIKE ? ", "%"+ params[:q]+"%").or(where(tags.include?(post_tags.tag_id))
【问题讨论】:
-
SQL 域中没有
tags.include?(post_tags.tag_id)。 -
注意:Ruby 是一种区分大小写的语言,大写字母在语法方面具有特定的含义。变量和方法名称应该是小写字母。大写字母表示
ClassName或CONSTANT_NAME形式的常量。 -
这是 MySQL 还是 Postgres? Postgres 具有可以索引的数组列,这对于这种情况非常有用。 MySQL 更喜欢关系型表结构。
-
@max 对于关联来说,这不是一个好的选择,我完全同意这一点,但对于像“标签”这样简单且非参考的东西,它的效果非常好。
标签: ruby-on-rails ruby where-clause