我如何随机化DataMapper集合并将其转换为JSON?

时间:2009-11-10 06:20:31

标签: sql json random sinatra datamapper

我正在尝试使用DataMapper / Sinatra构建一个随机照片JSON Feed。这是我到目前为止所拥有的......

Photo.favorites.to_json(:methods => [:foo, :bar])

这样可行。 dm-serializer库中提供了to_json方法。我想要做的就是将该Feed随机化,这样每次都不会以相同的顺序显示照片。由于DataMapper没有对随机选择的内置支持,我尝试对结果进行排序,但to_json生气,因为sort_by将DataMapper :: Collection转换为数组..

Photo.favorites.sort_by{rand}.to_json(:methods => [:foo, :bar])
# wrong argument type Hash (expected Data)

我搜索了这个错误并看到了很多关于ActiveRecord的Rails相关内容以及竞争to_json方法之间的冲突,但没有真正关于DataMapper。很多人建议使用json_pure代替json gem,所以我尝试将require 'json/pure'添加到我的Sinatra应用中。现在上面的查询给了我这个错误..

Photo.favorites.sort_by{rand}.to_json(:methods => [:foo, :bar])
# undefined method `[]' for #<JSON::Pure::Generator::State:0x106499880>

我也试过用直接SQL进行随机化:

def self.random
  repository(:default).adapter.query('SELECT * FROM photos WHERE favorite = 1 ORDER BY RAND();')
end

但这对我来说并不适用,因为它返回带有属性的Struct对象,而不是实际Photo类的实例。这意味着我无法利用像:methods这样的方便的to_json参数。

最后我尝试使用find_by_sql,但我想这个方法已从DataMapper中删除了?

def self.random
  find_by_sql("SELECT * FROM `photos` ORDER BY RAND();")
end
# undefined method `find_by_sql' for Photo:Class

啧!有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:2)

find_by_sql方法已移至dm-ar-finders插件。