活动记录查询 - 搜索多个字符串以查找多个字符串并仅在包含所有列时返回

时间:2013-09-18 19:01:46

标签: ruby-on-rails-3 postgresql activerecord

我需要帮助通过Active Record& amp;来设计查询。 PostgreSQL的。

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

模型看起来像这样:

Collection

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

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

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

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

1 个答案:

答案 0 :(得分: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}%"