1

我正在使用ruby 1.9.3ruby​​-datamapper 和postgresql. 我有一个充满条目的表,每个条目都有三个属性idtextcreated_at。最后一个是Date对象。

在我的应用程序中,我的SELECT一些条目是这样的:collection = Entry.all(:text => /SomeRegexp/)。我现在想知道返回的所有不同的值。我想到了以下两种方法:created_atDataMapper::Collection

  1. 遍历DataMapper::Collection并收集所有日期。

    dates = Array.new
    Entry.all(:text => /SomeRegexp/).each { |entry| dates.include?(entry.date) ? next : dates = dates << entry.date }
    

    优点:

    • 它应该工作

    缺点:

    • 海量数据速度很慢
  2. 向数据库询问每天的条目并收集 collection != nil 的日期

    dates = Array.new
    for date in DatabaseStartDate..Date.today
      Entry.all(:created_at => date, :text => /SomeRegexp/).empty? ? next : dates = dates << date)
    end
    

    优点:

    • 应该比上面的例子更快,尤其是在有大量数据的情况下

    缺点:

    • 许多数据库查询

注意:上面的代码是未经测试的伪代码,它应该只是让读者大致了解真实代码应该做什么,所以它不太可能工作。如果您需要更详细的示例,请随时发表评论,我会尝试更好地解释它!

下一条通知:如果您发现伪代码中有错误,请告诉我,这样我可以更快地开始!;)

所以最后我的问题是:我应该更喜欢哪种解决方案,或者我没有想到更好的解决方案?

4

2 回答 2

1

第三个选项:原始 SQL。

repository(:default).adapter.select('SELECT created_at FROM entries WHERE text SIMILAR TO ' + pattern)

其中模式将是类似于http://www.postgresql.org/docs/8.3/static/functions-matching.html中的表达式

于 2013-01-30T20:08:07.577 回答
0

好的,我做了一些测试,这是我的结果:

解决方案 #1 对于少量数据来说要快一些,但对于 >10_000 条记录,第二个解决方案显然更快。

通过仅选择一个需要的元素,可以提高这两种解决方案的性能,例如。Entry.all(:text => /SomeRegexp/, :fields => [:id, :date])

两个代码片段都对我有用。

如果您知道更好的解决方案(可能是内置在 datamapper 甚至 postgresql 中的),请重新回答问题!;)

于 2013-01-22T14:28:43.623 回答