Ruby on rails Ruby Rails中的多个where子句

Ruby on rails Ruby Rails中的多个where子句,ruby-on-rails,ruby,where-clause,Ruby On Rails,Ruby,Where Clause,我试图在Rails中创建一个搜索功能,允许用户使用标题中的关键字“materials list”或标签列表来搜索帖子 按标题搜索是简单而直接的。添加搜索“材料”相关表格的功能需要进行研究,但我能够得出: tags = Tag.where("tag_name LIKE ?","%"+params[:q]+"%").pluck("tag_id") @searchResults = Post.joins(:materia

我试图在Rails中创建一个搜索功能,允许用户使用标题中的关键字“materials list”或标签列表来搜索帖子

按标题搜索是简单而直接的。添加搜索“材料”相关表格的功能需要进行研究,但我能够得出:

tags = Tag.where("tag_name LIKE ?","%"+params[:q]+"%").pluck("tag_id")

@searchResults = Post.joins(:materials).where("post.name OR materials.name  LIKE ?", "%"+ params[:q]+"%")
但是,现在我想将tags表添加到搜索中。尝试以下方法时,会出现
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列表的表,还有一个包含无标记名的post/标记对列表的表。所以我需要能够进行查询,搜索标签列表,获取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))

未经测试,但可能类似的方法会起作用:

q_for_like = "%"+params[:q]+"%"

post_ids = PostTag.joins(:tag).where("tags.tag_name LIKE ?", q_for_like).pluck("post_id")

@searchResults = Post.
    joins(:materials).
    where(
        "post.id IN(?) OR post.name LIKE ? OR materials.name LIKE ?",
        post_ids, q_for_like, q_for_like
    )
我假设
“post.name或materials.name LIKE?”
在原始示例中无法正常工作,因此如果我错了,请更改该选项


编辑:另外,post.id和post.name可能应该是posts.id和posts.name。

在SQL land中没有
标记。include?(post\u tags.tag\u id)
。注意:Ruby是一种区分大小写的语言,大写字母在语法上有特定的含义。变量和方法名称应为小写字母。大写字母表示形式为
ClassName
CONSTANT\u NAME
的常量。这是MySQL还是Postgres?Postgres有可以索引的数组列,这对于这种情况非常有用。MySQL更喜欢关系表结构。你可能也对@max感兴趣。这不是关联的好选择,我完全同意,但是对于一些简单的非引用的东西,比如“标签”,它工作得很好。谢谢。这对我来说不是一个很好的解决方案,但却起到了帮助
PostTag
属于
Tag
,因此我需要从
Tag
获取
Tag\u名称的列表,然后使用这些结果和
在(?)
中从PostTag获取
post\u ID的列表,然后为搜索结果创建以下内容:
post.joins(:materials)。其中(“posts.name LIKE?或materials.name LIKE?或posts.id IN(?)、q_表示类似,q_表示类似,post_id)。但是,现在这会对相同数量的“materials”重复多次结果“每个职位都有一个职位
此外,
post.name或materials.name LIKE?
确实解决了我的问题我从
post.name或materials.name LIKE?
中预期的问题是,类似的部分仅应用于materials.name,而不是post.name;只要文章有名称(任何名称),post.name将为true。对于重复,请查看
distinct