我正在使用的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' )
这是一个有点哈克,但它做什么,我想它至少做;)
注:我不熟悉的DataMapper和我的答案可能不是标准,并使用DataMapper的建议范围内,但它应该有希望给你你正在寻找的结果。
我一直在寻找通过各种谷歌搜索和DataMapper的文件,我还没有找到一种方法,“为了通过ASSOCATION属性”。 我想到了唯一的解决办法是“原始” 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 。 这是近名为“直接对话,以您的数据存储”底部
请注意,这将不会从数据库返回动物园的对象,而不是原始数据直
Vehicle.joins(:user).order('users.name').all
或在滑轨2.3,
Vehicle.all(:joins => "inner join users on vehicles.user_id = user.id", :order => 'users.name')