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字段中搜索的字符串数组。

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

注意:我还安装了 Textacular Full Text Search gem。但是,我测试了一个搜索,我认为只有当记录包含所有传入的字符串时才应该搜索并返回匹配项,尽管我的数据库中存在具有这些字符串的记录,但搜索结果却一无所获。像这样: Collection.advanced_search('B0066AJ5TK&B0041KJSL2')

4

1 回答 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}%"
于 2013-09-18T19:19:21.427 回答