首页 文章

活动记录查询 - 搜索多个字符串以查找多个字符串并仅在它们全部包含时返回

提问于
浏览
1

我需要帮助通过Active Record和Postgresql设计查询 .

•查询必须搜索以下所有列...

模型看起来像这样:

Collection

 item_id1: String
 item_id2: String
 item_id3: String
 item_id4: String
 item_id5: String
 item_id6: String

•查询需要传入需要在所有 item_id 字段中搜索的字符串数组 .

•查询还必须仅返回包含数组中所有字符串的记录结果 .

Note: 我还安装了Textacular全文搜索gem . 但是,我测试了一个我认为只有在记录包含所有传入的字符串时才会搜索和返回匹配的搜索,并且搜索没有任何内容,尽管我的数据库中存在这些字符串的记录 . 像这样: Collection.advanced_search('B0066AJ5TK&B0041KJSL2')

1 回答

  • 2

    只是为了澄清:你想要记录数组中的每个字符串都在六个 item_id 字段中找到的位置吗?

    可能有一种更优雅的方式来做到这一点,但这就是我的头脑中的一切:

    terms = ['foo', 'bar', 'baz']
    
    conditions = []
    values = {}
    
    terms.each_with_index do |t,i|
      arg_id = "term#{i}".to_sym
       conditions << "(item_id1 = :#{arg_id} OR item_id2 = :#{arg_id} OR item_id3 = :#{arg_id} OR item_id4 = :#{arg_id} OR item_id5 = :#{arg_id} OR item_id6 = :#{arg_id})"
       values[arg_id] = t
    end
    
    Collection.where(conditions.join(' AND '), values)
    

    这应该产生这样的查询:

    SELECT "collections".* FROM "collections" WHERE ((item_id1 = 'foo' OR item_id2 = 'foo' OR item_id3 = 'foo' OR item_id4 = 'foo' OR item_id5 = 'foo' OR item_id6 = 'foo') AND (item_id1 = 'bar' OR item_id2 = 'bar' OR item_id3 = 'bar' OR item_id4 = 'bar' OR item_id5 = 'bar' OR item_id6 = 'bar') AND (item_id1 = 'baz' OR item_id2 = 'baz' OR item_id3 = 'baz' OR item_id4 = 'baz' OR item_id5 = 'baz' OR item_id6 = 'baz'))
    

    这是漫长而丑陋的,但应该得到你想要的结果 .

    如果您的意思是字段可能包含要搜索的字符串,而不是等于它们,则可以改为使用

    item_id1 LIKE #{arg_id}
    

    values[arg_id] = "%#{t}%"
    

相关问题