Datamapper:通过关联对结果进行排序

我正在开发一个使用Datamapper作为其ORM的Rails 3.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来对查询后的结果集进行排序,但显然这对任何性能没有帮助,也阻止了我对其他范围的进一步链接。

我花了一些时间去挖掘,最后出现了一个老博客,解决了这个问题。 它涉及在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' ) 

它有点hacky但它​​至少做了我想要它做的事情;)

注意:我不熟悉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对象,而是直接从数据库返回原始数据

 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')