Ruby on rails Ruby Rails中的多个where子句
我试图在Rails中创建一个搜索功能,允许用户使用标题中的关键字“materials list”或标签列表来搜索帖子 按标题搜索是简单而直接的。添加搜索“材料”相关表格的功能需要进行研究,但我能够得出: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
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
。