2011-06-15 58 views
0

我有三个型号,基本上是:Rails的高级排序

class Vendor 
    has_many :items 
end 

class Item 
    has_many :sale_items 
    belongs_to :vendor 
end 

class SaleItem 
    belongs_to :item 
end 

实际上,每个sale_item指向一个特定的item(但有可能是从item的基础价格的不同相关的数量和销售价格,因此是单独的模型),并且每个item由特定的vendor制成。

我想按供应商名称对所有sale_item进行排序,但这意味着要通过相关的item,因为这是该关联所在的位置。

我第一次尝试是改变SaleItem以下:

class SaleItem 
    belongs_to :item 
    has_one :vendor, :through => :item 
end 

,让我去找SaleItem.first.vendor,但不允许我做这样的事情:

SaleItem.joins(:vendor).all(:order => "vendors.name") 

有一个简单的方法来找出这些复杂的关联和排序?如果有一个可以处理这些事情的插件,那将会特别好。在这个应用程序中,我有很多不同类型的表来添加排序,而且我觉得这将成为大部分搜索工作的一部分。

+0

所以你只是想通过assoicated供应商分类你的项目? – 2011-06-16 00:41:31

+0

SaleItems有一个绑定到items.id的外键列(sale_items.item_id),并且Items有一个外键列(items。vendor_id)绑定到vendors.id。我想按与其关联商品关联的供应商对SaleItems进行分类。 – clem 2011-06-16 01:04:46

回答

0

这绝对可以用更复杂的SQL查询(可能使用find_by_sql)来完成,但您也可以在Ruby中轻松完成。你可以试试下面的:

SaleItem.find(:all, :include => { :items => :vendors }).sort do |first,second| 
    first.vendor.name <=> second.vendor.name 
end 

我没有测试过,所以它可能不是这样的工作完全,但它应该给你一个可能的解决方案是一个好主意。

编辑:找到一篇似乎解决了这个问题的旧博客文章。希望这仍然适用于最新版本的ActiveRecord。

来源:http://matthewman.net/2007/01/04/eager-loading-objects-in-a-rails-has_many-through-association/

第二个编辑:直接从Rails文档

要包含关联的深层次结构,使用哈希:

for post in Post.find(:all, :include => [ :author, { :comments => { :author => :gravatar } } ])

那我不仅会抓住所有的评论,还会抓住所有的作者和gravatar的照片。您可以混合使用任意组合的符号,数组和散列来描述要加载的关联。

有你的解释。

+0

我试图做这样的事情,但'sale_items'中没有'vendor_id'列。数据库需要查看'sale_items'中的'item_id'列,然后在'items'表中查看该商品的'vendor_id'列,并从相关供应商处获得'name'值。 – clem 2011-06-16 16:55:37

+0

答案已经被编辑了一个可能的解决方案。对不起,我无法在工作中自己查看。 – Luke 2011-06-16 17:09:11

+0

就是这样!我不知道我是如何度过这么长时间的搜索,却从未发现过的。它在哪里? – clem 2011-06-17 18:07:57

0

你是否真的需要你的sale_items按照数据库排序,或者你是否等待,直到它呈现出来,并通过javascript排序客户端(有一些伟大的排序库) - 这将节省服务器CPU和(后端)代码复杂度。

+0

我想在服务器上排序,因为这些项目也会分页,如果不显示,我不想加载整个数据集。 – clem 2011-06-16 16:53:25