【问题标题】:Rails Advanced SortingRails 高级排序
【发布时间】:2011-06-15 23:53:28
【问题描述】:

我有三个模型,基本上:

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_items 进行排序,但这意味着要通过关联的item,因为这是关联所在。

我的第一次尝试是将SaleItem 更改为以下内容:

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

这允许我查找 SaleItem.first.vendor,但不允许我执行以下操作:

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

有没有一种简单的方法来找出这些复杂的关联和排序?如果有一个插件可以处理这些事情,那就太好了。我有很多不同类型的表要在这个应用程序中添加排序,我觉得这将是计算工作的很大一部分。

【问题讨论】:

  • 所以您只想按相关供应商对商品进行分类?
  • SaleItems 有一个与 items.id 相关联的外键列 (sale_items.item_id),而 Items 有一个与 vendor.id 相关联的外键列 (items.vendor_id)。我想按与其关联项目关联的供应商对销售项目进行排序。

标签: ruby-on-rails sqlite sorting activerecord


【解决方案1】:

这绝对可以通过更复杂的 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 =&gt; [ :author, { :comments =&gt; { :author =&gt; :gravatar } } ])

这不仅会抓取所有 cmets,还会抓取所有作者和 gravatar 图片。您可以以任意组合混合和匹配符号、数组和哈希来描述您要加载的关联。

这是你的解释。

【讨论】:

  • 我试图做这样的事情,但sale_items 中没有vendor_id 列。数据库需要查看sale_items 中的item_id 列,然后在items 表中查看项目的vendor_id 列,并从关联的供应商处获取name 值。
  • 已使用可能的解决方案编辑了答案。抱歉,我不能在工作时自己在这里检查。
  • 就是这样!我不知道我怎么花了这么长时间搜索,却从来没有找到。文档在哪里?
【解决方案2】:

您真的需要通过数据库对 sale_items 进行排序,还是等到它出现并通过 javascript 对客户端进行排序(那里有一些很棒的排序库)——这将节省服务器 CPU 和(后端)代码复杂度。

【讨论】:

  • 我想在服务器上排序,因为这些项目也会分页,如果不显示我不想加载整组数据。
猜你喜欢
  • 2013-01-29
  • 2013-03-24
  • 1970-01-01
  • 2012-03-12
  • 2018-05-03
  • 1970-01-01
  • 2018-01-25
  • 2016-11-11
  • 2021-01-30
相关资源
最近更新 更多