1

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

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

所以效果很好。该to_json方法在 dm-serializer 库中提供。我想做的就是随机化该提要,这样照片就不会每次都以相同的顺序显示。由于 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而不是jsongem,所以我通过添加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 类的实例。这意味着我无法利用方便的 to_json 参数,例如:methods.

最后我尝试使用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

嘘!关于如何解决这个问题的任何想法?

4

1 回答 1

2

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

于 2009-11-10T19:29:37.997 回答