【问题标题】:sort list of objects by property on associated object按关联对象的属性对对象列表进行排序
【发布时间】:2009-05-13 14:18:25
【问题描述】:

我可以按关联对象的属性对对象列表进行排序吗?

例如下面的类

class RosterSlot < ActiveRecord::Base
  belongs_to :event
  belongs_to :skill
  belongs_to :person
end

我想做类似的事情 RosterSlot.find(:all, :order => Skill.name)

这意味着activerecord需要做一个join和order。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    是的,您可以使用 :include 选项进行连接。

    RosterSlot.find(:all, :include => [:skill], :order => "skills.name ASC")
    

    :order 选项接受一个 SQL 片段,因此技能是对复数数据库表名的引用。

    :include 接受一个 Active Record 关联数组。

    请参阅http://www.railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002313&name=find 了解更多信息。

    【讨论】:

    • 这就是我所追求的,现在如此明显。谢谢。
    【解决方案2】:

    您也可以在 ruby​​ 中使用 sort 方法执行此操作。

    RosterSlot.all.sort { |x,y| x.skill.name <=> y.skill.name }
    

    我会亲自让您的数据库进行排序,但此方法可用于对通过 ActiveRecord::Base 查找以外的方法返回的模型对象的结果集进行排序。

    【讨论】:

    • 您至少应该确保对技能进行连接,否则每次排序迭代都会访问数据库两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2011-03-21
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多