【问题标题】:Contains in a where condition包含在 where 条件中
【发布时间】:2015-11-12 14:20:16
【问题描述】:

技术规格:ruby 2.2.1p85,Rails 4.2.3。

这是完美的工作:

@performances = Performance.where(date: start_date..end_date).includes(:production_page).where(pages: {organization_id: organization_id, layout_id: nil, genre: genre_word})

我的问题是,目前,genre 和genre_word 需要完全匹配。我需要知道流派是否包含流派_字。我试过包括? (语法错误)并尝试使用 .find_by_sql 重写查询。

例子:

genre_word: Comedy

pages.genre: Comedy, Drama 

理想情况下,pages.genre 和genre_word 会将此记录视为自 pages.genre 中的“Comedy”以来的匹配项。我还必须保持对 organization_id 和 layout_id 的搜索。

感谢您对此提供的任何帮助。

【问题讨论】:

  • 我认为你有这个相反的:genre_word: genre 应该是:genre: genre_word。如果一个页面只有genre_word 设置为genre,那么它至少应该匹配。对吗?
  • 你是对的。上面的编辑。

标签: ruby-on-rails ruby conditional where contains


【解决方案1】:

解决方案最终是:

@performances = Performance.includes(:production_page)
   .where("pages.genre LIKE ?", "%#{genre}%").references(:production_page)

感谢任何帮助过的人。

【讨论】:

    【解决方案2】:

    您可以使用 SQL LIKEILIKE 运算符进行部分字符串匹配。一个简单的例子:

    genre_name = "Drama"
    Article.where("genre LIKE ?", "%#{genre_name}%")
    

    这将生成 SQL 查询:

    SELECT "articles".* FROM "articles" WHERE (name LIKE '%Drama%')
    

    ILIKELIKE 的不区分大小写的姐妹。百分号将匹配搜索词之前或之后的零个或多个字符,因此在示例中,如果文章的类型为“喜剧、戏剧”,它也会匹配。

    【讨论】:

    • 我非常感谢这个答案,但关键是我还需要维护其他变量。 @performances = Performance.where(date: start_date..end_date).includes(:production_pagestatus_id: 100, display_on_district_calendar: 1, organization_id: organization_id, layout_id: nil, "genre LIKE ?", "%#{genre_word}%"})导致语法错误(语法错误,意外',',期待=> ...layout_id:nil,“genre LIKE ?”)。
    • 我明白了。如果为LIKE 部分添加另一个where 会怎样? @performances = Performance.where(date: start_date..end_date).includes(:production_page).where(pages: {organization_id: organization_id, layout_id: nil}).where(pages: { "genre LIKE ?", "%#{genre_word}%" })
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多