【问题标题】:Rails dynamically add condition to mysql queryRails 为 mysql 查询动态添加条件
【发布时间】:2018-12-12 16:31:27
【问题描述】:

如何在sql查询中动态添加条件

例如,如果我有一个元素,那么它看起来像

query=['one_element']

User.where('name LIKE ?, %"#{query[0]}"%')

但如果不止一个

User.where('name LIKE ? and LIKE ? and Like... , %"#{query}"%', ..so on)

我用myslq

所以我的主要目标是拆分搜索查询,如果它包含超过 2 个单词并在一个 sql 查询中分别搜索它们

not where(name:'john dou') but where(name:'john' and name:'dou')

【问题讨论】:

  • 下面的两位响应者都回答了,为您提供了一种通过“OR”组合条件生成 SQL 的方法。但是您上面的示例使用“AND”来组合条件。只是在我回答之前确认一下:你真的想要这里使用“AND”运算符吗?例如,您是否希望 "WHERE name LIKE '%erky%' AND name LIKE '%eef%'" 匹配 name = "beef jerky" 的记录,但不匹配 name = "beef" 或 name = "jerky" 的记录“?

标签: mysql sql ruby-on-rails


【解决方案1】:

如果您的 MySQL 版本支持RLIKEREGEXP_LIKE

User.where("RLIKE(name, :name_query)", name_query: query.join("|"))

否则,您必须使用 ActiveRecord or 运算符手动构建:

# In the User model
scope :name_like, ->(name_part) {
  return self.all if name_part.blank?
  where("name LIKE :name_query", name_query: "%#{name_part}%")
}
scope :names_like, ->(names) {
  relation = User.name_like(names.shift)
  names.each { |name| relation = relation.or(name_like(name)) }
  relation
}

然后你可以将你想要的任何名称部分的数组传递给它:

query = ["john", "dou"]
User.names_like(query)

【讨论】:

    【解决方案2】:

    首先用它的分隔符分割单词query.split(' ')这会给你一个单词数组。然后你可以在rails中使用如下所示。

    User.where(name: ['John', 'dou']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多