Datamapper: Sorting results through association

2019-07-31 14:39发布

我正在使用的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排序的结果集后的查询,但显然这不是帮助任何性能,也停止了我从其他范围进一步链接。

Answer 1:

我花了一些时间四处最后变成了具有解决这个问题的旧博客。 它涉及到手动建设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' )

这是一个有点哈克,但它做什么,我想它至少做;)



Answer 2:

注:我不熟悉的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 。 这是近名为“直接对话,以您的数据存储”底部

请注意,这将不会从数据库返回动物园的对象,而不是原始数据直



Answer 3:

Vehicle.joins(:user).order('users.name').all

或在滑轨2.3,

Vehicle.all(:joins => "inner join users on vehicles.user_id = user.id", :order => 'users.name')


文章来源: Datamapper: Sorting results through association