如何获取ruby DataMapper :: Collection的所有不同属性值?

时间:2013-01-21 22:17:29

标签: ruby database ruby-datamapper

我正在使用ruby 1.9.3和ruby-datamapper与postgresql。我有一个包含条目的表格,每个条目都有三个属性:idtextcreated_at。最后一个是Date对象。

在我的申请中我SELECT有些条目如下:collection = Entry.all(:text => /SomeRegexp/)。我现在想知道返回的created_at中出现的DataMapper::Collection的所有不同值。我想到了以下两种方式:

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

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

    优点:

    • 它应该工作

    缺点:

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

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

    优点:

    • 应该比上面的示例更快,特别是对于大量数据

    缺点:

    • 许多数据库查询

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

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

    所以最后我的问题是:我应该选择哪种解决方案,还是有更好的解决方案没有出现在我脑海中?

2 个答案:

答案 0 :(得分:1)

第三个选项:原始SQL。

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

其中pattern将是http://www.postgresql.org/docs/8.3/static/functions-matching.html

中的表达式

答案 1 :(得分:0)

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

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

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

这两段代码片段都适用于我。

如果您知道一个更好的解决方案(可能是内置于datamapper甚至postgresql中的内容),请重新提出问题! ;)