【问题标题】:Rails combine multiple activerecord relationsRails 结合了多个 activerecord 关系
【发布时间】:2014-04-28 08:36:57
【问题描述】:

我想联合多个活动记录关系

例如,

apple_companies = Company.where("name like ?","%apple%")
banana_companies = Company.where("name like ?","%banana%")

我想结合这两个关系。

不合并,合并是 apple_companies.merge(banana_companies) => Company.where("name like ? and name like ?", "%apple%","%banana%")

我想 Company.where("name like ? or name like ?", "%apple%","%banana%")

之后,

我会编码

companies = Company.none
company_name_list.each do |name|
    like = "%"+name+"%"
    companies += Company.where("name like ?",like)
end

但我编写的代码使公司成为数组.....

所以我无法向公司订购和寻呼... :(

谢谢

【问题讨论】:

    标签: ruby ruby-on-rails-4 rails-activerecord activerecord-relation


    【解决方案1】:
    apple_companies = Company.where("name like ?","%apple%")
    banana_companies = Company.where("name like ?","%banana%")
    
    apples = apple_companies.where_values.reduce(:and)
    bananas = banana_companies.where_values.reduce(:and)
    
    Company.where(apples.or(bananas))
    

    更多示例请参见ActiveRecord Arel OR condition

    【讨论】:

      【解决方案2】:

      我遇到的最好的结果是抓取并合并两个查询的 id,然后像这样搜索它们:

      apple_companies = Company.where("name like ?","%apple%").pluck(:id)
      banana_companies = Company.where("name like ?","%banana%").pluck(:id)
      ids = apple_companies + banana_companies.uniq
      Company.where(id: ids)
      

      这四行似乎应该可以合二为一,但它确实有效。

      【讨论】:

      • 不需要 uniq,因为数据库不会返回重复的行。但我对此表示赞同,因为这就是我要建议的内容
      • 使用 ids 代替 pluck 也可以:apple_companies = Company.where("name like ?","%apple%").ids banana_companies = Company.where("name like ?","%banana%").ids
      【解决方案3】:

      在这种情况下,您可以使用任何其他答案。但是在更一般的情况下,我强烈建议使用any_of gem。有了这个 gem,你可以做到:

      apple_companies = Company.where("name like ?","%apple%")
      banana_companies = Company.where("name like ?","%banana%")
      
      Company.where.any_of(apple_companies, banana_companies)
      

      已经有一个pull request 可以将此功能添加到未来的 Rails 版本中。

      【讨论】:

        【解决方案4】:

        请尝试使用

        Company.where('name LIKE ? OR name LIKE ?','%apple%', '%banana%')
        

        Company.where('name IN (?)', ['%apple%', '%banana%'])
        

        根据你的代码:

        names = []
        company_name_list.each do |name|
            names << "%"+name+"%"
        end
        

        那么你可以这样做:

        companies = Company.where('name LIKE ANY(Array[?])', names)
        

        【讨论】:

        • Company Load (1.4ms) SELECT companies.* FROM companies WHERE (name LIKE ANY(Array['%코리아%','%한국%'])) Mysql2::Error : 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '(Array['%코리아%','%한국%']))' 附近使用的正确语法有错误。
        • Company.where('name IN (?)', ['%apple%', '%banana%']) 这不是“喜欢”
        • Company.where('name LIKE ? OR name LIKE ?','%apple%', '%banana%') 我不能使用那种语法
        • 这是我的错误。 MySql 中没有 Array 数据类型。此语法在 PostrgesSql 中有效。
        【解决方案5】:

        迟到的答案,但Arel 会解决它。

        Company.where(Company.arel_table[:name].matches_any(["%apple%", "%banana%"]))
        

        【讨论】:

          【解决方案6】:

          使用

          Company.where(name: IN ('%apple%','%banana%'))
          

          【讨论】:

          • 这会导致语法错误。您可以使用 Company.where(name: ['%apple%','%banana%']),但它不会执行 OP 请求的 like 语法。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          • 2016-02-21
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          相关资源
          最近更新 更多