1

DataMapper/Sinatra を使用して、少しランダムな写真の JSON フィードを構築しようとしているところです。これが私がこれまでに持っているものです..

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

それでうまくいきます。メソッドはto_jsondm-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 アプリに追加して試してみました。上記のクエリでは、代わりにこのエラーが表示されます..jsonrequire '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

おい!これを解決する方法について何か考えはありますか?

4

1 に答える 1

2

find_by_sqlメソッドはdm-ar-findersプラグインに移動されました。

于 2009-11-10T19:29:37.997 に答える