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)
そのエラーを検索したところ、Rails 関連の ActiveRecord や競合するto_json
メソッド間の競合について多くの情報が見つかりましたが、DataMapper については何もありませんでした。多くの人がgemjson_pure
の代わりに使用することを推奨していたので、Sinatra アプリに追加して試してみました。上記のクエリでは、代わりにこのエラーが表示されます..json
require 'json/pure'
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
しかし、それは実際の Photo クラスのインスタンスではなく、属性を持つ Struct オブジェクトを返すため、私にとってはうまくいきません。これは、のような便利な 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
おい!これを解決する方法について何か考えはありますか?