упорядочение коллекции по имуществу ассоциации - PullRequest
1 голос
/ 01 апреля 2010
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

Теперь, как мне отсортировать коллекцию по свойству last_updated класса Status?

Заранее спасибо!

p.s. Я только что написал код ruby ​​из памяти, это всего лишь пример, он не предназначен для компиляции, но я надеюсь, что вы поняли!

Ответы [ 3 ]

2 голосов
/ 01 апреля 2010

В дополнение к упомянутым опциям вы можете использовать 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 голос
/ 01 апреля 2010

У вас есть две возможности:

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")
0 голосов
/ 01 апреля 2010

Когда вы получаете members из team, вам нужно присоединиться к status, чтобы получить его. Создайте named_scope (Rails 2.x) в Team, который включает членов и :joins => :status, затем :order_by => 'statuses.last_updated'. (также записано по памяти)

...