Как я могу рандомизировать коллекцию DataMapper и преобразовать ее в JSON? - PullRequest
0 голосов
/ 10 ноября 2009

Я дергаю себя за волосы, пытаясь создать небольшой случайный фото-канал JSON с помощью DataMapper / Sinatra Вот то, что у меня есть до сих пор ..

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)

Я искал эту ошибку и видел много вещей, связанных с Rails, об ActiveRecord и конфликтах между конкурирующими методами 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. Это означает, что я не могу использовать удобные аргументы 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

Sheesh! Есть мысли, как решить эту проблему?

1 Ответ

2 голосов
/ 10 ноября 2009

Метод find_by_sql был перемещен в плагин dm-ar-finders.

...