我正在使用ruby 1.9.3
和ruby-datamapper与postgresql
。我有一个包含条目的表格,每个条目都有三个属性:id
,text
和created_at
。最后一个是Date
对象。
在我的申请中我SELECT
有些条目如下:collection = Entry.all(:text => /SomeRegexp/)
。我现在想知道返回的created_at
中出现的DataMapper::Collection
的所有不同值。我想到了以下两种方式:
遍历DataMapper::Collection
并收集所有日期。
dates = Array.new
Entry.all(:text => /SomeRegexp/).each { |entry| dates.include?(entry.date) ? next : dates = dates << entry.date }
优点:
缺点:
向数据库询问每天的条目并收集收集日期!= nil
dates = Array.new
for date in DatabaseStartDate..Date.today
Entry.all(:created_at => date, :text => /SomeRegexp/).empty? ? next : dates = dates << date)
end
优点:
缺点:
注意:上面的代码是未经测试的伪代码,它应该让读者大致了解真正的代码应该做什么,所以它不太可能工作。如果你需要一个更详细的例子随时评论,我会尝试更好地解释它!
下一条:注意:如果您在伪代码中发现错误请告诉我,这样我就可以更快地开始了! ;)
所以最后我的问题是:我应该选择哪种解决方案,还是有更好的解决方案没有出现在我脑海中?
答案 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中的内容),请重新提出问题! ;)