按协会的财产订购集合

时间:2010-03-31 22:23:33

标签: ruby-on-rails ruby associations

class Person
  belongs_to :team

class Status
  #has last_updated property

class Team
  has_many :members, :class => "Person"

好的,所以我有一个Team类,里面有很多人,每个人都有一个状态,每个状态都有一个last_updated属性。

我目前使用类似于:

的集合渲染部分
 =render :partial => "user", :collection => current_user.team.members

现在我如何通过Status类的last_updated属性对集合进行排序?

提前致谢!

P.S。 我刚刚从内存中编写了ruby代码,这只是一个例子,它不是要编译的,但我希望你能得到这个想法!

3 个答案:

答案 0 :(得分:2)

除了提到的选项,您可能还想使用 named_scope

class Member
  named_scope :recently_active, :joins => :status, :order => "statuses.updated_at DESC"
end

# now you can do:
current_user.team.members.recently_active

如果您总是对这样的成员进行排序,请考虑使用default_scope

class Member
  default_scope :joins => :status, :order => "statuses.updated_at DESC"
end

# and you can use this client code
current_user.team.members

答案 1 :(得分:1)

您有两种可能性:

1)更改关联定义以添加order子句。

class Team
  has_many :members, :class => "Person", :joins => :status, 
                   :order => "statuses.updated_at DESC"
end
current_user.team.members # ordered by updated_at

2)将:order子句传递给members方法。

如果order by列根据上下文发生更改,则此方法适用。

current_user.team.members( :joins => :status, 
                :order => "statuses.updated_at DESC")

答案 2 :(得分:0)

获得members的{​​{1}}后,您需要加入team才能将其拉入。在Team上创建一个named_scope(Rails 2.x),引入成员和status,然后是:joins => :status。 (也是从记忆中写的)