Я дергаю себя за волосы, пытаясь создать небольшой случайный фото-канал 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! Есть мысли, как решить эту проблему?