7

私は、データマッパーをORMとして使用するRails3.2アプリに取り組んでいます。関連するモデルの属性で結果セットを並べ替える方法を探しています。具体的には、次のモデルがあります。

class Vehicle
  include DataMapper::Resource

  belongs_to :user
end

class User
  include DataMapper::Resource

  has n, :vehicles
end

ここで、車両を照会して、ドライバーの名前で並べ替えることができるようにしたいと思います。次のことを試しましたが、どちらもDatamapperでは機能しないようです。

> Vehicle.all( :order => 'users.name' )
ArgumentError: +options[:order]+ entry "users.name" does not map to a property in Vehicle

> Vehicle.all( :order => { :users => 'name' } )
ArgumentError: +options[:order]+ entry [:users, "name"] of an unsupported object Array

現在、Rubyを使用してクエリ後に結果セットを並べ替えていますが、明らかにパフォーマンスには役立たず、他のスコープでさらにチェーンすることもできません。

4

3 に答える 3

7

私はもう少し掘り下げて時間を費やし、最終的にこの問題の解決策がある古いブログを見つけました. DataMapper で順序付けクエリを手動で作成する必要があります。

から: http://rhnh.net/2010/12/01/ordering-by-a-field-in-a-join-model-with-datamapper

def self.ordered_by_vehicle_name direction = :asc
  order = DataMapper::Query::Direction.new(vehicle.name, direction)
  query = all.query
  query.instance_variable_set("@order", [order])
  query.instance_variable_set("@links", [relationships['vehicle'].inverse])
  all(query)
end

これにより、関連付けによって並べ替えながら、他のスコープでチェーンすることができます。たとえば、次のようになります。

User.ordered_by_vehicle_name(:desc).all( :name => 'foo' )

少しハックですが、少なくとも私がやりたかったことは実行します;)

于 2012-09-27T14:09:31.370 に答える
1

注:私は DataMapper に精通していないため、私の回答は DataMapper の使用に関する標準と推奨事項の範囲内にない可能性がありますが、探している結果が得られることを願っています。


私はさまざまな Google 検索と DataMapper のドキュメントを調べてきましたが、「関連付け属性で並べ替える」方法が見つかりませんでした。私が考えた唯一の解決策は、「生の」SQL です。

クエリは次のようになります。

SELECT vehicles.* FROM vehicles
LEFT JOIN users ON vehicles.user_id = users.id
ORDER BY users.name

残念ながら、私の理解では、データベースに直接クエリを実行すると、オブジェクトは取得されませんがVehicle、データベースからのデータが取得されます。

ドキュメントから: http://datamapper.org/docs/find.html「データストアに直接話しかける」というタイトルの下部にあります

これはZooオブジェクトではなく、データベースから直接生データを返すことに注意してください

于 2012-09-23T14:53:29.427 に答える
-3
Vehicle.joins(:user).order('users.name').all

またはRails 2.3では、

Vehicle.all(:joins => "inner join users on vehicles.user_id = user.id", :order => 'users.name')
于 2012-09-14T17:50:16.597 に答える